使用GNU STL的GCC 4.8会为std :: string构造函数生成错误的代码吗?

use*_*401 13 c++ gcc stl undefined-behavior

所以有点C++代码:

void func( const std::string& theString )
{
    std::string theString( theString );
    theString += " more string";
    std::cout << theString;
}
Run Code Online (Sandbox Code Playgroud)

GCC 4.8和编译好VS 2013.根据我的C++知识,代码是可以的,一个局部变量theString被带入范围,然后隐藏theString在函数参数中.在theString构造点,唯一theString的范围是传递给std::string构造函数的函数参数.std::string然后命名构造theString,它进入范围并theString在代码中稍后使用.唷!

但是,GCC似乎theString传递给std::string构造函数的行为是本地theString(尚未构造)导致编译的程序崩溃.使用VS 2013,代码编译并运行良好.

所以,

  1. 我的代码是否正确?或者我在做一些超出规范的事情,这意味着GCC的行为是未定义的.
  2. 这是GCC中的错误吗?

Vla*_*cow 30

不,您的代码无效.

根据C++标准(3.3.2声明点)

1名称的声明点紧接其完整的声明者(第8条)之后和初始化者之前(如果有的话),除非如下所述.

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

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

(3.3.3块范围,#2)

参数名称不应在函数定义的最外层块中重新声明,也不得在与函数try-block相关联的任何处理程序的最外层块中重新声明.

  • "3.3.2"中该示例的规范问题是:对于C++ 11 [初始化是否需要左值到右值的转换?是`int x = x;`UB?](http://stackoverflow.com/q/14935722/1708801)和C++ 14 [C++标准是否因使用C中的不确定值和未定义行为而改变++ 1Y?](http://stackoverflow.com/q/23415661/1708801) (2认同)

vz0*_*vz0 14

这是C++中未定义的行为.paxdiablo引用了C++ 03标准:

名称的声明点紧跟在其完整的声明者(第8条)之后和其初始化者(如果有的话)之前......

例:

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

这里第二个x用它自己的(不确定的)值初始化.