Ссылка не может быть 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.