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确实有一个,所以在这种情况下,这没有什么区别,但对于其他类,它可以.

  • 你得到了我的 +1,因为“标准明确允许称为“复制省略”的东西;) (2认同)