Alw*_*ing 1 c++ copy-constructor
C++ Primer(第5版)在第499页说明允许编译器替换
string null_book = "9-999-9999-9"; // copy initialization
Run Code Online (Sandbox Code Playgroud)
对于
string null_book("9-999-9999-9"); // compiler omits the copy constructor
Run Code Online (Sandbox Code Playgroud)
另一方面,这篇文章表明(一般来说)这两种形式可以产生不同的结果.
如何协调C++ Primer中的语句与引用的帖子?
本书试图用普通的C++代码来说明复制省略.这并不意味着允许编译器将复制初始化更改为直接初始化,即使在您显示的初始化的情况下,copy-initialization-with-copy-elision也具有与直接初始化相同的效果.
允许的可观察行为的唯一变化是忽略对复制/移动构造函数和析构函数的调用.调用的另一个构造函数永远不会更改.从而:
struct Meow {
explicit Meow(int); // #1
Meow(double); // #2
Meow(const Meow&); // #3
};
Meow m = 1; // OK, always call #2, may or may not call #3
Meow n(1); // OK, call #1, never call #3
Meow p = {1}; // Error: copy-list-initialization selected explicit constructor
Meow q{1}; // OK, call #1, never call #3
Meow r = {1.0}; // OK, call #2, never call #3
Run Code Online (Sandbox Code Playgroud)