代码之家  ›  专栏  ›  技术社区  ›  Slava

无处引用C++ [关闭]

  •  3
  • Slava  · 技术社区  · 8 年前

    思考这个问题 Why can I initialize reference member with data member before initializing the data member? Why is initialization of a new variable by itself valid? 我想到了以下奇怪的代码:

    int main()
    {
        int &ri = ri;
        ri = 0;
    }
    

    live demo

    更新:当引用是全局引用时,会发生不同的情况: godbolt ,gcc似乎将其声明为指针并使其指向自身

    注意:我知道这段代码是无效的,我不希望编译器有特殊的行为,但我认为查看内部可能有助于理解为什么以下代码不是非法的,以及引用如何在该语言中工作:

    struct foo {
        int &ri = i;
        int i = 0;
    };
    

    或者这个:

     extern int i;
     int &ri = i;
     int i = 0;
    

    更新2:虽然赋值肯定是UB,但如果声明本身:

    int &ri = ri;
    

    ri

    1 回复  |  直到 8 年前
        1
  •  0
  •   zdf    8 年前

    不是回答,只是长篇大论。

    “……它将不在C++上编译而不使用CAST……” .

    references source pointers source 将生成 完全相同的代码

    引用本身没有地址 . 这个 following i 的地址两次:

    int i;
    int &ri = i;
    cout << &ri << endl << &i;
    

    因为语言 ,我认为一个好的编译器 必须发出警告而不是错误 : uninitialized variable used .

    [编辑]

    T x = x; 是可取的,但是 C++不是从头开始设计的:它必须与C向后兼容。

    所以,你找到了一个 合法的 “…这个引用实际上指向哪里?”