3

以下代码使用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)
4

2 回答 2

6

// 2. dereference a nullptr pointer and pass it as reference

取消引用空指针是Undefined Behavior,因此无论您将它作为引用还是按值传递,事实是您已经取消引用它并因此调用了 UB,这意味着从那时起所有赌注都关闭了。

您已经在这里调用了 UB:

int &ir = *ip; //ip is null, you cannot deref it without invoking UB.
于 2013-04-23T08:09:11.303 回答
1

因为ir它只是它的一个影子,*ip它本身不会导致未定义的行为。

未定义的行为是使用指向nullptr_t. 我的意思是使用*ip. 所以

int &ir = *ip;
          ^^^

导致UB。

于 2013-04-23T08:09:40.577 回答