РЕДАКТИРОВАТЬ: Это связано с активной проблемой 232 для C ++ Standard Core Language Active Issues
Таким образом, реальный вопрос в том, как стандарт допустит косвенное обращение через нулевой указатель?
Рассмотрим следующий код:
struct a { int x; };
struct b { int y; };
struct c: a, b { };
b *f(c *pointer_to_c) { return pointer_to_c; }
f(...)
должен проверить, является ли pointer_to_c
значением NULL
, и вернуть NULL
, если это так.(Указатель NULL
всегда является указателем NULL
, независимо от того, как вы его разыгрываете.)
Теперь рассмотрим следующее:
b *f_ref(c &reference_to_c) { return &reference_to_c; }
Первый вопрос: f_ref
нужно проверить, является ли &reference_to_c
NULL
?Второй вопрос: если C ++ в конечном итоге определяет поведение косвенности через нулевой указатель, означает ли это, что f_ref
должен проверять NULL
?(Я полагаю, что ответ зависит от того, что разрешено стандартом, т. Е. Если он говорит, что «приведение NULL-ссылки к базовому классу не определено для множественного наследования», то ответ явно нет.)
Для одного последнегоголоволомки, теперь рассмотрим это:
const b *f_const_ref(const c &reference_to_c) { return &reference_to_c; }
Должен ли f_const_ref
проверять &reference_to_c
до NULL
?Кстати, в VC ++ 2010 все три функции были оптимизированы до f
, то есть все три функции проверяют входные данные по NULL
.
, так что вы не можете передать нулевую ссылку в четко определенномПрограмма, означает ли это, что если стандарт C ++ в конечном итоге разрешает косвенное обращение через нулевой указатель, это не может привести к выражению или подвыражению, которое иначе связалось бы с нулевым указателем и создало бы нулевую ссылку?Другими словами, если стандарт допускает косвенное обращение через нулевой указатель, как они могут это разрешить?