为什么我不能在C++中初始化一个将自身纳入其初始值的对象?

Kai*_*ged 3 c++ string undefined-behavior

当我遇到以下错误键入的代码时,我正在调试程序,类似于以下内容:

//Original (wrong)
std::string first("Hello");
std::string second = first + second;

//Instead of this (correct)
std::string first("Hello");
std::string second = first + something_else;
Run Code Online (Sandbox Code Playgroud)

显然我并没有尝试这样做(我想不出为什么有人会想这样做),但它让我思考.它看起来不像原版应该工作,我认为它是未定义的.实际上,这是我问题的根源.

要使问题更加通用,请考虑以下事项:

SomeType a;
SomeType b = a + b;
Run Code Online (Sandbox Code Playgroud)

行为是否未定义仅仅是因为b尚未初始化(请参阅此答案)?

如果行为未定义,那么我真正的问题是,为什么?

对于某些标准容器,这只是未定义的std::string,或者是否在更一般意义上未定义(STL类,用户定义的类,POD,基本类型)?

该标准的哪一部分适用于此?

如果需要,假设这是c ++ 11.

Mic*_*urr 6

C++ 11标准就此说明了新声明的名称的范围:

3.3.2声明点[basic.scope.pdecl]

声明的声明就在其完整的声明者(第8条)之后和初始化者(如果有的话)之前,除非如下所述.[例如:

int x = 12;
{ int x = x; }
Run Code Online (Sandbox Code Playgroud)

这里第二个x用它自己的(不确定的)值初始化. - 结束例子]

在先前的C++标准中有类似的措辞.

在我的脑海中,我能想到的一个基本原理是名称可以用在获取对象地址的初始化表达式中.