相关疑难解决方法(0)

使用支撑初始化列表时,为什么首选std :: initializer_list构造函数?

考虑一下代码

#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.

c++ constructor initializer-list language-lawyer c++11

30
推荐指数
3
解决办法
2711
查看次数