gpt4 book ai didi

c++ - 在成员初始化器列表中,我可以创建对不在列表中的成员变量的引用吗?

转载 作者:IT老高 更新时间:2023-10-28 22:12:25 25 4
gpt4 key购买 nike

考虑:

#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;
}
}

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

(当然,这个例子毫无意义。只是为了澄清我在说什么。)

最佳答案

你可以这样做1因为:

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

在构造函数的复合语句中使用该引用(在成员初始化结束后)也可以。这是因为 y 被认为是已初始化的,而 x 现在指的是一个生命周期已经开始的对象。


<子>1 - 语言律师有一个警告。从技术上讲,引用需要绑定(bind)到有效对象( [dcl.ref]/5 ),这意味着其生命周期已经开始。然而,像 Core Language issue 363详情,预计会成功! Core Language issue 453 中讨论了有问题的措辞和可能的解决方案。 (由@T.C. 在已删除评论中提供)。标准中有一个错误,但您的代码旨在形成良好的格式,并且实现通常都知道它。

关于c++ - 在成员初始化器列表中,我可以创建对不在列表中的成员变量的引用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50020255/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com