Пустые ссылки - где в стандарте C ++ - PullRequest
2 голосов
/ 08 апреля 2011

Возможные дубликаты:
C ++: нулевая ссылка
Когда вызов функции-члена для нулевого экземпляра приводит к неопределенному поведению?

Есть ли в стандарте C ++ какой-либо раздел, показывающий, что NULL-ссылки некорректны? Я пытаюсь показать моему лектору (это для задания, за которое меня оценивают), что следующее выражение - неопределенное поведение:

AClass* ptr = 0;
AClass& ali = *ptr;
std::cout << "\n" << (AClass*) &ali << '\n';

Нарушения, которые я вижу, это разыменование нулевого указателя, а затем ссылка на нулевую ссылку. В программе, которую он использует в качестве правильного примера, он сравнивает возврат ссылки на разыменованный указатель:

(AClass*) &ali != (AClass*) 0

В качестве теста на валидность объектов. Я видел это как совершенно неопределенное поведение; Я хочу найти цитату из стандарта, которая более конкретна для моего объяснения.

Если я не прав, то, пожалуйста, покажите, где я допустил ошибку.

Ответы [ 2 ]

6 голосов
/ 08 апреля 2011

§8.5.3 / 1: «Переменная, объявленная как T &, то есть« ссылка на тип T »(8.3.2), должна быть инициализирована объектом или функцией типа T или объектом который может быть преобразован в T. "

Приведенный выше код не инициализирует ссылку объектом или функцией типа T или объектом, который может быть преобразован в T. Нарушение «обязывает». В этот момент единственное место для вопроса - это неопределенное поведение или это квалифицируемое как диагностируемое правило, и в этом случае компилятор должен будет выдать сообщение об ошибке. В любом случае, это явно неправильно.

0 голосов
/ 03 сентября 2014

Вы должны использовать указатели, а не ссылки, если вы хотите переназначить. Ссылки инициализируются раз и навсегда и не могут быть переназначены. Указатели могут быть созданы, но не инициализированы, а также могут быть переназначены.

8.3.2 / 1:

A reference shall be initialized to refer to a valid object or function. 
[Note: in particular, a null reference 
cannot exist in a well-defined program, because the only way to create such 
a reference would be to bind it to the    
“object” obtained by dereferencing a null pointer, which causes undefined 
behavior. As described in 9.6, a reference cannot be bound directly to a bit-field]

1,9 / 4

Certain other operations are described in this International Standard as undefined 
(for example, the effect of dereferencing the null pointer)
...