Ker*_* SB 11

因为int没有区别.该int a = 1;语法是复制initialziation,同时int a(1);直接初始化.即使对于通用类类型,编译器也几乎可以保证生成相同的代码,但是复制初始化要求类没有声明的复制构造函数explicit.

为了解释这一点,直接初始化直接调用相应的构造函数:

T x(arg);
Run Code Online (Sandbox Code Playgroud)

另一方面,复制初始化表现为"好像"一个副本:

T x = arg; // "as if" T x(T(arg));, but implicitly so
Run Code Online (Sandbox Code Playgroud)

明确允许并鼓励复制省略,但"仿佛"构造必须仍然有效,即复制构造函数必须是可访问的,而不是显式的或删除的.一个例子:

struct T
{
    T(int) { } // one-argument constructor needed for `T x = 1;` syntax

    // T(T const &) = delete;            // Error: deleted copy constructor
    // explicit T(T const &) = default;  // Error: explicit copy constructor
    // private: T(T const &) = default;  // Error: inaccessible copy constructor
};
Run Code Online (Sandbox Code Playgroud)