C++入门(第5版)在第499页中指出允许编译器替代

string null_book = "9-999-9999-9"; // copy initialization

对于
string null_book("9-999-9999-9"); // compiler omits the copy constructor

另一方面,this post表明(通常)这两种形式可以产生不同的结果。

如何将 C++ Primer 中的语句与引用的帖子协调起来?

最佳答案

这本书试图用普通的C++代码来说明复制省略。这并不意味着允许编译器将复制初始化更改为直接初始化,即使在您显示的初始化情况下,带复制复制的复制初始化与直接初始化具有相同的效果。

允许的可观察行为的唯一变化是取消对复制/移动构造函数和析构函数的调用。另一个构造函数永远不会改变。从而:

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

关于c++ - 编译器可以通过直接初始化代替拷贝初始化吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31504831/

10-12 23:58