C++ 通过取消引用空指针来分配引用

C++ 通过取消引用空指针来分配引用,c++,pointers,reference,undefined-behavior,null-pointer,C++,Pointers,Reference,Undefined Behavior,Null Pointer,在上面的方法中,我尝试去引用空指针。当我调用这个函数时,它不会给出异常。我发现当返回类型是通过引用时,它不会给出异常,如果它是通过值,那么它会给出异常。即使将空指针的解引用指定为引用(如下面的行),它也不会给出 int& fun() { int * temp = NULL; return *temp; } 这里我的问题是,编译器在引用的情况下不进行解引用吗?当您解引用空指针时,不一定会得到异常;可以保证的是行为是未定义的(这实际上意味着对于行为是什么根本没有保证) 一

在上面的方法中,我尝试去引用空指针。当我调用这个函数时,它不会给出异常。我发现当返回类型是通过引用时,它不会给出异常,如果它是通过值,那么它会给出异常。即使将空指针的解引用指定为引用(如下面的行),它也不会给出

int&  fun()
{
    int * temp = NULL;
    return *temp;
}

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

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


一旦计算了
*temp
表达式,就无法对程序的行为进行推理。

取消对空指针的引用是未定义的行为

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

当然,我将在第N次添加这个C++标准引用,但似乎需要。

关于未定义的行为

C++标准第1.3.24节规定:

允许的未定义行为范围从完全忽略情况和不可预测的结果,到在翻译或程序执行过程中以环境特有的记录方式(有或没有发出诊断消息)行为,再到终止翻译或执行(发出诊断信息)

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

编辑:
正如@James McNellis在评论中恰当地指出的,

如果未使用返回的指针或引用,则该行为是定义良好的。不要*空指针,它是UB。(未定义的行为,你永远不能认为它除了点燃你的狗和强迫你拿shrooms之外,它会做任何事情,这将导致难以置信的轶事)

Algol/C系列中空指针的一些历史和信息:


未定义行为的示例和含义:

我不确定是否理解您试图执行的操作。未定义对**NULL**指针的取消引用

如果您想指出您的方法并不总是返回值,您可以将其声明为:

博乐(国际和国际)

或stl方式(类似于std::map insert):

std::pair fun();
或推进方式:

std::pair<int, bool> fun();
boost::可选乐趣();

您不被允许取消引用空指针,因此编译器可以在您不这样做的情况下生成代码。如果您仍然这样做,编译器可能会很乐意告诉您,但也不必这样做。合同中规定您不得这样做


在这种情况下,我打赌编译器会很好地告诉您编译时已经存在的问题,如果您只是正确设置警告级别。

是的,同意上述UB。但我的问题是,如果取消对空指针或非空指针的引用以将其分配给引用,那么编译器会取消引用吗ing操作?如-Int*t=NULL;Int&t1=*t;@G Mann:Reference只是它被初始化为的原始类型的一个
别名。它的实现方式是编译器的一个实现细节&标准并没有定义它应该如何实现。当您遵循空指针时,代码无效,编译器可以执行任何操作hing。问它为什么会这样做是没有意义的。@G Mann-具体发生什么取决于引用是如何实现的。标准也没有这样说,只是说明引用应该如何工作。“返回函数内部局部变量的引用或指针也是一种未定义的行为。”这是不正确的:如果未使用返回的指针或引用,则行为定义良好。我添加的注释与我在其他帖子中添加的注释相同-是的,同意上述UB。但我的问题是,如果取消对空指针或非空指针的引用以将其分配给引用,那么编译器是否执行取消引用操作tion?像-Int*t=NULL;Int&t1=*t;对于大多数编译器来说,在许多情况下,引用是作为指针实现的。除此之外,它还取决于编译器、设置等。请纠正我的错误。如果它是作为指针实现的,那么编译器可能不会执行解引用操作。引用是作为指针处理的rs在内部,它们只是在您对它们使用的语法上有所不同。知道您的取消引用仅将pointervalue“分配”给引用,使其成为NULL引用。这不会触发任何内存访问。当您按值返回时,取消引用将导致0处的内存访问,这几乎总是给您一个segfault。
std::pair<int, bool> fun();
boost::optional<int> fun();