В какой момент разыменование нулевого указателя становится неопределенным поведением?

Если я фактически не обращаюсь к разыменованному «объекту», разыменование нулевого указателя все еще не определено?

int* p = 0;
int& r = *p;    // undefined?
int* q = &*p;   // undefined?

Чуть более практичный пример: могу ли я разыменовать нулевой указатель, чтобы различать перегрузки?

void foo(Bar&);
void foo(Baz&);

foo(*(Bar*)0);  // undefined?

Хорошо, ссылочные примеры определенно являются неопределенным поведением в соответствии со стандартом:

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

К сожалению, выделенная часть неоднозначна. Является ли часть привязки причиной неопределенного поведения, или же достаточно части разыменования ?

8
задан fredoverflow 20 August 2011 в 10:50
поделиться