在成员初始值设定项列表中,我可以创建对不在列表中的成员变量的引用吗?

Dev*_*lar 17 c++ initialization

考虑:

#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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

(当然,这个例子毫无意义.只是为了澄清我在谈论的内容.)

Sto*_*ica 21

您可以这样做1,因为:

  1. x并且y都在范围内([basic.scope.class]/1).
  2. 由于您在构造函数开始执行后获取引用([class.cdtor]/1)并且y已获取存储([basic.life]/7),因此可以绑定该引用y.

在构造函数的复合语句中使用该引用(在成员初始化完成后)也没问题.那是因为y被认为是初始化的,并且x现在指的是其生命周期已经开始的对象.


1 - 对语言律师有一个警告.从技术上讲,引用需要绑定到有效对象([dcl.ref]/5),这意味着它的生命周期已经开始.但是,像核心语言问题363详细信息一样,它有望工作!核心语言问题453讨论了有问题的措辞和可能的解决方案(@TC在删除的评论中提供).标准中存在一个错误,但是您的代码应该很好地构建,并且实现通常都会意识到它.