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,因为:
x并且y都在范围内([basic.scope.class]/1).y已获取存储([basic.life]/7),因此可以绑定该引用y.在构造函数的复合语句中使用该引用(在成员初始化完成后)也没问题.那是因为y被认为是初始化的,并且x现在指的是其生命周期已经开始的对象.
1 - 对语言律师有一个警告.从技术上讲,引用需要绑定到有效对象([dcl.ref]/5),这意味着它的生命周期已经开始.但是,像核心语言问题363详细信息一样,它有望工作!核心语言问题453讨论了有问题的措辞和可能的解决方案(@TC在删除的评论中提供).标准中存在一个错误,但是您的代码应该很好地构建,并且实现通常都会意识到它.