以下代码使用nullptr
指针和引用来欺骗:
#include <cstdio>
void printRefAddr(int &ref) {
printf("printAddr %p\n", &ref);
}
int main() {
int *ip = nullptr;
int &ir = *ip;
// 1. get address of nullptr reference
printf("ip=%p &ir=%p\n", ip, &ir);
// 2. dereference a nullptr pointer and pass it as reference
printRefAddr(*ip);
// 3. pass nullptr reference
printRefAddr(ir);
return 0;
}
问题:在 C++ 标准中,注释语句 1..3 是有效代码还是未定义行为?
这与不同版本的 C++ 相同还是不同(旧版本当然会使用0
文字而不是nullptr
关键字)?
额外的问题:是否有已知的编译器/优化选项,实际上会导致上述代码做一些意外/崩溃?例如,是否有任何编译器的标志,它将nullptr
为初始化引用的任何地方生成隐式断言,包括从 ? 传递引用参数*ptr
?
一个好奇的输出示例,没有什么意外:
ip=(nil) &ir=(nil)
printAddr (nil)
printAddr (nil)