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.用你的例子更新了答案。我知道有人会看到并思考。