Ссылка не может быть NULL или может быть NULL?

Я прочитал из Википедии, что:

"ссылки не могут быть нулевыми, тогда как указатели могут; каждая ссылка относится к некоторому объекту, хотя она может быть или не быть действительной."

но я не верю из-за следующего кода посмотрите на него компилятор не дает ошибки:

class person
{
public:
virtual void setage()=0;
};
main()
{
person *object=NULL;
person &object1=*object;
}

пожалуйста, уточните этот момент.

6 ответов


слова person &object1=*object - Это не то же самое, что сказать person &object1=NULL. Вероятно, компилятор просто недостаточно умен, чтобы узнать, что вы разыменовываете нулевой указатель, но вы все равно получите ошибку времени выполнения. Так что они отчасти верны до сих пор;)


в коде:

person *object=NULL;
person &object1=*object;

вы разыменовываете нулевой указатель, поэтому вы получаете неопределенное поведение. И чтобы ответить на ваш вопрос, нет такой вещи, как нулевая ссылка.

и для решения другой части вашего вопроса, просто потому, что программа компилируется, нет никакой гарантии, что она правильная или что она будет работать. Компиляторы C++ не обязаны даже пытаться диагностировать тип ошибки, содержащийся в коде.


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


Что бы сбой программы. Ты пробовал его запустить? выполнение * object будет уважать нулевой указатель, поэтому на самом деле ваша ссылка никогда не назначается.


Ну, вы можете делать все, что угодно вы хотите в C++. Другой пример:

person &object1 = *( reinterpret_cast<person*>(0) );

вы вызываете неопределенное поведение в приведенном выше случае, помимо случая, который вы упомянули!


clang 3.5 даже предупреждает о возможной последующей нулевой проверке ссылки:

/tmp/person.C:11:6: warning: reference cannot be bound to dereferenced null pointer in well-defined C++ code; pointer may be assumed to
      always convert to true [-Wundefined-bool-conversion]
if (&object1) {}
~~   ^~~~~~~
1 warning generated.