考虑一下代码
#include <iostream>
class Foo
{
int val_;
public:
Foo(std::initializer_list<Foo> il)
{
std::cout << "initializer_list ctor" << std::endl;
}
/* explicit */ Foo(int val): val_(val)
{
std::cout << "ctor" << std::endl;
};
};
int main(int argc, char const *argv[])
{
// why is the initializer_list ctor invoked?
Foo foo {10};
}
Run Code Online (Sandbox Code Playgroud)
输出是
ctor
initializer_list ctor
Run Code Online (Sandbox Code Playgroud)
据我所知,该值10被隐式转换为Foo(第一个ctor输出),然后初始化构造函数启动(第二个initializer_list ctor输出).我的问题是为什么会发生这种情况?标准构造函数Foo(int)不是更好的匹配吗?也就是说,我本来希望这个片段的输出是公正的ctor.
PS:如果我将构造函数标记Foo(int)为explicit,则Foo(int)调用唯一的构造函数,因为整数10现在不能隐式转换为a Foo.