如果我实际上没有访问取消引用的“对象”,那么取消引用空指针是否仍然未定义?
int* p = 0;
int& r = *p; // undefined?
int* q = &*p; // undefined?
一个更实际的例子:我可以取消引用空指针来区分重载吗?
void foo(Bar&);
void foo(Baz&);
foo(*(Bar*)0); // undefined?
好的,根据标准,参考示例绝对是未定义的行为:
在定义良好的程序中不能存在空引用,因为创建此类引用的唯一方法是将其绑定到通过取消引用空指针获得的“对象”,这会导致未定义的行为。
不幸的是,强调的部分是模棱两可的。是导致未定义行为的绑定部分,还是取消引用部分就足够了?