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

时间:2017-03-21 13:43:22

标签: c++ c++11 initialization c++14

我在问

Type t{...};

Type t({...});

Type t = {...};

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

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

1 个答案:

答案 0 :(得分:7)

不,这三种形式都是截然不同的,在不同情况下可能是独立的,也可能是形式不正确的。

Here's an example第一个表单编译,但第二个和第三个不编译:

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

int main()
{
    Type t1{1, 2};     // Ok
    Type t2({1, 2});   // error
    Type t3 = {1, 2};  // error
}

Here's the example第二种形式编译,但第一种和第三种形式不编译:

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
}

Here's an example,由@T.C.提供,其中第三种形式编译,但第一种和第二种形式不编译:

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
}