2010-10-04 4 views
0

должен приводить к следующему результату в неопределенном поведении?Вопрос о стандарте C++

следует указать значение pointer2 be NULL?

double *pointer = 0; 
double &value = *pointer; 
double *pointer2 = &value; 
+0

Связанный: http://stackoverflow.com/questions/2474018/when-does-invoking-a-member -function-on-a-null-instance-result-in-undefined-behav – GManNickG

+1

Какой C-стандарт, по вашему мнению, даже позволяет «double & value» ??? Это разные языки с разными стандартами и различными наборами функций. Arrggghhhh !!!!! – dmckee

+0

@dmc my bad, fixed – Anycorn

ответ

6

Да.

double *pointer = 0; // init `pointer` to a NULL pointer value 
double &value = *pointer; // dereference it 

Стандарт конкретно говорит этой ситуации - от 8.3.2/4 «Ссылки»:

Ссылка должна быть инициализирована см действительного объекта или функции. [Примечание: в частности, пустая ссылка не может существовать в четко определенной программы, потому что единственный способ создания такой ссылки будет привязать его к «объекту», полученного разыменования нулевого указателя, который вызывает неопределенное поведение. В качестве , описанного в 9.6, ссылка не может быть привязана непосредственно к битовому полю . ]

+0

Имеет ли значение, что я не читаю/не записываю в место памяти как таковое? – Anycorn

+0

@aaa: Не касается стандарта. – sepp2k

+0

У вас может не произойти сбой в этой точке, потому что компилятор, возможно, на самом деле не пытается «прочитать» ячейку памяти 0. Однако это одна из неудачных причин неопределенного поведения - компилятор не должен действовать так, как будто это ошибка. Тем не менее, установка ссылки с помощью разыменования NULL-указателя является неопределенным поведением. –

3

Да, вы разыменования нулевого указателя, когда вы делаете *pointer в строке 2.