通过解除引用NULL指针来分配引用

G M*_*ann 12 c++ pointers reference null-pointer undefined-behavior

int&  fun()
{
    int * temp = NULL;
    return *temp;
}
Run Code Online (Sandbox Code Playgroud)

在上面的方法中,我试图取消引用NULL指针.当我调用此函数时,它不会给出异常.我发现当返回类型是引用时它不会给出异常,如果它是按值,那么它.即使将NULL指针的解引用引用为引用(如下面的行),它也不会给出.

int* temp = NULL:
int& temp1 = *temp;
Run Code Online (Sandbox Code Playgroud)

在这里我的问题是,在引用的情况下编译器是否进行解除引用?

Alo*_*ave 16

取消引用空指针是Undefined Behavior.

未定义的行为意味着任何事情都可能发生,因此无法为此定义行为.

不可否认,我将在第n次添加此C++标准报价,但似乎需要.

关于未定义的行为,

C++标准第1.3.24节规定:

允许的未定义行为包括完全忽略不可预测的结果,在翻译或程序执行期间以环境特征(有或没有发出诊断消息)的特定行为,终止翻译或执行(发布时)一条诊断信息).

注意:
另外,只是为了引起注意:
使用返回的引用或指向函数内局部变量的指针也是未定义的行为.你应该使用new在freestore(heap)上分配指针,然后返回一个引用/指针.

编辑:
正如@James McNellis,在评论中恰当地指出,
如果未使用返回的指针或引用,则行为已明确定义.

  • "在函数内返回引用或指向局部变量的指针也是未定义的行为." 这是不正确的:如果未使用返回的指针或引用,则行为定义良好. (3认同)
  • 当您使用空指针时,代码无效,编译器可以执行任何操作.问*为什么*它做了什么都没有意义. (2认同)

Jam*_*lis 7

当您取消引用空指针时,您不一定会得到异常; 所有保证的是行为是未定义的(这实际上意味着根本不保证行为是什么).

一旦*temp表达式被评估,就无法推断程序的行为.