nullptr 引用在 C++ 中是未定义的行为吗? [复制]

2024-04-19

下面的代码愚弄了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(使用前将#替换为@)

nullptr 引用在 C++ 中是未定义的行为吗? [复制] 的相关文章

随机推荐