struct A
{
A(std::vector<int> x):
x_(std::move(x)) {}
inline operator std::vector<int>()
{
return x_;
}
inline operator int()
{
return x_[0];
}
std::vector<int> x_;
};
A add()
{
return A({1,2,3,4});
}
int main()
{
std::vector<int> b{add()};
}
在上面的代码中,
b
将只有 1 个元素,这意味着转换 A->int
是通过 A->vector<int>
选择的。这是为什么?
是因为在构造initializer_list时,两种转换都有效,所以它选择了一个
A->int
?
std::vector
有一个接受 std::initialize_list
的构造函数。当类具有这样的构造函数时,如果可能的话,在使用大括号初始化时将始终选择该重载。在这种情况下,如果 add()
的结果转换为 int
,那么它就是可能的。如果您尝试 b(add());
,您将获得 add()
结果的副本:https://godbolt.org/z/8TqMEfeYf