各种初始化和构造之间的关系?

use*_*020 4 c++ initialization c++11 c++14

我问是否

Type t{...};
Run Code Online (Sandbox Code Playgroud)

Type t({...});
Run Code Online (Sandbox Code Playgroud)

Type t = {...};
Run Code Online (Sandbox Code Playgroud)

相当于?如果一个工作,另一个也应该使用相同的结果?

如果没有explicit修饰语,它们是否相同?

Igo*_*nik 7

不,这三种形式都是截然不同的,并且在不同的情况下可能是独立的或形式错误的.

这是第一个表单编译的示例,但第二个和第三个表单不编译:

class Type {
public:
    explicit Type(int, int) {}
};

int main()
{
    Type t1{1, 2};     // Ok
    Type t2({1, 2});   // error
    Type t3 = {1, 2};  // error
}
Run Code Online (Sandbox Code Playgroud)

这是第二个表单编译的示例,但第一个和第三个表单不编译:

class Pair {
public:
    Pair(int, int) {}
};

class Type {
public:
    Type(const Pair&) {}
};

int main()
{
    Type t1{1, 2};     // error
    Type t2({1, 2});   // Ok
    Type t3 = {1, 2};  // error
}
Run Code Online (Sandbox Code Playgroud)

这是一个例子,由@TC提供,其中第三种形式编译,但第一种和第二种形式不编译:

struct StrangeConverter {
    explicit operator double() = delete;
    operator float() { return 0.0f; }
};

int main() {
  StrangeConverter sc;
  using Type = double;
  Type t1{sc};     // error
  Type t2({sc});   // error
  Type t3 = {sc};  // Ok
}
Run Code Online (Sandbox Code Playgroud)