Если я фактически не обращаюсь к разыменованному «объекту», разыменование нулевого указателя все еще не определено?
int* p = 0;
int& r = *p; // undefined?
int* q = &*p; // undefined?
Чуть более практичный пример: могу ли я разыменовать нулевой указатель, чтобы различать перегрузки?
void foo(Bar&);
void foo(Baz&);
foo(*(Bar*)0); // undefined?
Хорошо, ссылочные примеры определенно являются неопределенным поведением в соответствии со стандартом:
пустая ссылка не может существовать в четко определенной программе, потому что единственный способ создать такую ссылку - это привязать ее к «объекту» полученный разыменованием нулевого указателя , что вызывает неопределенное поведение .
К сожалению, выделенная часть неоднозначна. Является ли часть привязки причиной неопределенного поведения, или же достаточно части разыменования ?