代码之家  ›  专栏  ›  技术社区  ›  Rick Jim DeLaHunt

为什么在初始化数据成员之前,我可以用数据成员初始化引用成员?[副本]

c++
  •  0
  • Rick Jim DeLaHunt  · 技术社区  · 6 年前

    考虑:

    #include <string>
    #include <iostream>
    
    class Foo
    {
         public:
             Foo( char const * msg ) : x( y ) 
             {
                 y = msg;
             }
    
             std::string const & x;
    
         private:
             std::string y;
    };
    
    int main( int argc, char * argv[] )
    {
        if ( argc >= 2 )
        {
            Foo f( argv[1] );
            std::cout << f.x << std::endl;
        }
    }
    

    这将编译并打印第一个参数。。。但我怀疑它是否真的“合法”/形式良好。我知道初始化列表应该按照变量在类中的声明顺序初始化变量,以免引用尚未初始化的变量。但是成员变量呢 ? 我可以安全地创建对它们的引用吗?

    0 回复  |  直到 6 年前
        1
  •  21
  •   StoryTeller - Unslander Monica    6 年前

    你可以这样做 1

    1. x y 两者都已在范围内( [basic.scope.class]/1
    2. 因为您是在构造函数开始执行之后获取引用的( [class.cdtor]/1 y 已获得( [basic.life]/7 .

    在构造函数的复合语句中使用该引用(在成员初始化完成之后)也可以。那是因为 y 被视为已初始化,并且 现在引用其生存期已开始的对象。


    [dcl.ref]/5 ),意思是生命开始的人。但是,就像 Core Language issue 363 Core Language issue 453 (由@T.C.在删除的评论中提供)。标准中有一个bug,但是您的代码应该是格式良好的,实现通常都知道它。

        2
  •  3
  •   eerorika    6 年前

    但是不在初始值设定项列表中的成员变量呢?

    变量是否在初始值设定项列表中,这与此无关。如果变量不在初始值设定项列表中(也没有默认的成员初始值设定项),则它是默认初始化的。

    y x . 这不是因为成员初始值设定项列表,因为成员初始值设定项列表不影响成员的初始化顺序。成员按其声明的顺序初始化。

    然而,是否 y


    关于 (或者 正确性 更准确地说),我建议您花一些时间来考虑 Foo 已复制。什么会 指什么?这就是类的用户所期望的吗?

        3
  •  0
  •   3CxEZiVlQ    6 年前

    我可以安全地创建对它们的引用吗?

    y x(y) 引用初始化是合法的。