是 int &ref = ref; 结构良好

Ala*_*lan 22 c++ reference language-lawyer selfinitialization

我了解到评估未初始化的变量是未定义的行为。特别int i = i;是未定义的行为。我已阅读未初始化变量用作其自身初始化程序的行为是什么?

但是,使用引用变量来初始化自身也是未定义的行为吗?特别是,int &ref = ref;根据 C++ 标准,UB 也是吗?

int &ref = ref; // Is this well-formed or ill-formed or UB
Run Code Online (Sandbox Code Playgroud)

所有编译器都会编译上述程序(clang 会发出警告)。这是因为它是未定义的行为,所以任何事情都可以发生,还是程序格式良好?


此外,如果我为 分配一些值ref,程序的行为会与之前的情况相比发生变化吗?

int &ref = ref;

int main()
{
    ref = 1; //does this change the behavior of the program from previous case
}
Run Code Online (Sandbox Code Playgroud)

我注意到对于第二个片段,我们遇到了段错误。

我读过的一些参考文献是:

用作自己的初始值设定项的未初始化变量的行为是什么?

为什么新变量的初始化本身有效?

Art*_*yer 25

这不是定义的行为。

[dcl.ref]p5

[...] 引用应被初始化以引用有效的对象或函数。

而且没有任何int对象可以参考。


您也可以说该引用正在其生命周期之外使用。

[基本生活]

  1. 引用的生命周期从其初始化完成时开始。引用的生命周期结束时就像它是需要存储的标量对象一样。

  2. 本文档中赋予对象和引用的属性仅在给定对象或引用的生命周期内适用。

因此,在引用本身初始化之前,不能“使用”它来初始化自身,这就是 Clang 对此的抱怨(https://godbolt.org/z/Ea4qPoWbs):

note: use of reference outside its lifetime is not allowed in a constant expression
    2 |     int& ref = ref;
                       ^
Run Code Online (Sandbox Code Playgroud)