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

C++ 各种初始化和构造之间的关系?,c++,c++11,initialization,c++14,C++,C++11,Initialization,C++14,我在问你 Type t{...}; 及 及 是否等效?如果其中一个有效,那么另一个也应该具有相同的结果 如果没有显式的修饰语,它们是等价的吗?否,所有三种形式都是不同的,在不同的情况下可能是格式良好或格式不良的 其中,第一种形式可编译,但第二种和第三种形式不可编译: class Type { public: explicit Type(int, int) {} }; int main() { Type t1{1, 2}; // Ok Type t2({1, 2

我在问你

Type t{...};

是否等效?如果其中一个有效,那么另一个也应该具有相同的结果


如果没有显式的修饰语,它们是等价的吗?

否,所有三种形式都是不同的,在不同的情况下可能是格式良好或格式不良的

其中,第一种形式可编译,但第二种和第三种形式不可编译:

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

int main()
{
    Type t1{1, 2};     // Ok
    Type t2({1, 2});   // error
    Type t3 = {1, 2};  // error
}
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
}
其中第二种形式编译,但第一种和第三种形式不编译:

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

int main()
{
    Type t1{1, 2};     // Ok
    Type t2({1, 2});   // error
    Type t3 = {1, 2};  // error
}
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
}
,由提供,其中第三种形式编译,但第一种和第二种形式不:

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
}

这实际上取决于
和可用的构造函数。不,这三个都不同。第一个编译而其他两个不编译。以及第二个编译的位置,但不是第一个或第二个third@Someprogrammerdude这个例子的目的是证明这三种形式实际上并不等同。对于该术语的某些定义,没有要求该示例“有意义”。话虽如此,在大括号初始化的世界中,
explicit
确实有意义地应用于使用多个参数的构造函数本质上是
类型t3(类型{1,2})类型{1,2}
来编译,但是
类型t1{1,2}也会编译。我想不出有什么办法可以解决这个问题。这里有一个例子,第一个表单和第二个表单都编译,但做的事情不同。“我找不到一种方法让第三个表单编译,而第一个表单不编译。”@T.C.用你的例子更新了答案。我知道有人会看到并思考。