cai*_*rol 21 c++ string initialization
两者之间有什么区别吗?
std::string s1("foo");
Run Code Online (Sandbox Code Playgroud)
和
std::string s2 = "foo";
Run Code Online (Sandbox Code Playgroud)
?
Ara*_*raK 27
是和否.
第一个是显式初始化,第二个是初始化复制.标准允许用第一个替换第二个.实际上,生成的代码是相同的.
简而言之,这就是:
std::string s1("foo");
Run Code Online (Sandbox Code Playgroud)
表单的字符串构造函数:
string ( const char * s );
Run Code Online (Sandbox Code Playgroud)
被要求s1.
在第二种情况下.创建一个临时文件,并为该临时文件调用所提到的earler构造函数.然后,调用复制构造函数.例如:
string s1 = string("foo");
Run Code Online (Sandbox Code Playgroud)
在实践中,第二种形式被优化,成为第一种形式.我还没有看到没有优化第二种情况的编译器.
Ste*_*sop 13
从表面上看,第一个调用const char*构造函数进行初始化s1.第二个使用const char*构造函数初始化临时值,然后使用复制构造函数传入对该临时值的引用进行初始化s2.
但是,标准明确允许称为"复制省略"的东西,这意味着正如AraK所说,即使复制构造函数具有可观察的副作用,第二个也可以合法地替换为第一个,因此更改会影响程序的输出.
但是,当完成此替换时,编译器仍必须检查该类是否具有可访问的复制构造函数.所以潜在的区别在于第二种形式要求复制构造函数是可调用的,即使编译器不必调用它.显然std::string确实有一个,所以在这种情况下,这没有什么区别,但对于其他类,它可以.
| 归档时间: |
|
| 查看次数: |
17554 次 |
| 最近记录: |