下面的代码愚弄了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;
}
Question:在 C++ 标准中,注释语句 1..3 是有效代码还是未定义行为?
这对于不同版本的 C++ 是相同还是不同(较旧的版本当然会使用0
文字而不是nullptr
关键词)?
额外问题:是否存在已知的编译器/优化选项,这实际上会导致上述代码执行意外/崩溃的操作?例如,是否有任何编译器的标志,它会生成隐式断言nullptr
初始化引用的任何地方,包括传递引用参数*ptr
?
出于好奇,没有什么意外的示例输出:
ip=(nil) &ir=(nil)
printAddr (nil)
printAddr (nil)
// 2. dereference a nullptr pointer and pass it as reference
取消引用空指针是未定义的行为,因此无论您将其作为引用还是按值传递,事实是您已取消引用它并因此调用 UB,这意味着从那时起所有的赌注都将被取消。
您已经在此处调用了 UB:
int &ir = *ip; //ip is null, you cannot deref it without invoking UB.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)