должен приводить к следующему результату в неопределенном поведении?Вопрос о стандарте C++
следует указать значение pointer2 be NULL?
double *pointer = 0;
double &value = *pointer;
double *pointer2 = &value;
должен приводить к следующему результату в неопределенном поведении?Вопрос о стандарте C++
следует указать значение pointer2 be NULL?
double *pointer = 0;
double &value = *pointer;
double *pointer2 = &value;
Да.
double *pointer = 0; // init `pointer` to a NULL pointer value
double &value = *pointer; // dereference it
Стандарт конкретно говорит этой ситуации - от 8.3.2/4 «Ссылки»:
Ссылка должна быть инициализирована см действительного объекта или функции. [Примечание: в частности, пустая ссылка не может существовать в четко определенной программы, потому что единственный способ создания такой ссылки будет привязать его к «объекту», полученного разыменования нулевого указателя, который вызывает неопределенное поведение. В качестве , описанного в 9.6, ссылка не может быть привязана непосредственно к битовому полю . ]
Имеет ли значение, что я не читаю/не записываю в место памяти как таковое? – Anycorn
@aaa: Не касается стандарта. – sepp2k
У вас может не произойти сбой в этой точке, потому что компилятор, возможно, на самом деле не пытается «прочитать» ячейку памяти 0. Однако это одна из неудачных причин неопределенного поведения - компилятор не должен действовать так, как будто это ошибка. Тем не менее, установка ссылки с помощью разыменования NULL-указателя является неопределенным поведением. –
Да, вы разыменования нулевого указателя, когда вы делаете *pointer
в строке 2.
Связанный: http://stackoverflow.com/questions/2474018/when-does-invoking-a-member -function-on-a-null-instance-result-in-undefined-behav – GManNickG
Какой C-стандарт, по вашему мнению, даже позволяет «double & value» ??? Это разные языки с разными стандартами и различными наборами функций. Arrggghhhh !!!!! – dmckee
@dmc my bad, fixed – Anycorn