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,代码编译并运行良好.
所以,
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相关联的任何处理程序的最外层块中重新声明.
vz0*_*vz0 14
这是C++中未定义的行为.paxdiablo引用了C++ 03标准:
名称的声明点紧跟在其完整的声明者(第8条)之后和其初始化者(如果有的话)之前......
例:
Run Code Online (Sandbox Code Playgroud)int x = 12; { int x = x; }这里第二个x用它自己的(不确定的)值初始化.
| 归档时间: |
|
| 查看次数: |
1486 次 |
| 最近记录: |