是nullptr引用在C ++中未定义行为? [重复](Are nullptr referenc

2019-08-31 21:07发布

这个问题已经在这里有一个答案:

  • 通过解除引用NULL指针分配参考 5个答案

下面的代码傻瓜周围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)

Answer 1:

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

取消对NULL指针是未定义行为 ,所以无论你把它作为一个引用或值,但事实是,你已经取消引用它,因此调用UB,从这一点意义上的全盘皆输。

你已经调用UB在这里:

int &ir = *ip; //ip is null, you cannot deref it without invoking UB.


Answer 2:

由于ir只是一个阴影*ip也不会造成对自己的未定义的行为。

未定义行为是使用指向指针nullptr_t 。 我的意思是使用*ip 。 因此

int &ir = *ip;
          ^^^

导致UB。



文章来源: Are nullptr references undefined behaviour in C++? [duplicate]