我可以将init与列表列表ctor一起使用,以确保类似{a}的表达式不会导致意外的隐式转换吗?还有一个想法:我应该担心吗?与简单地使用{a}相比,编写a不太可能是一个错误,但是,另一方面,从代码中仍不清楚我们是通过隐式转换构造对象的。

class Foo
{
    explicit Foo (std::initializer_list<Bar> ilist) { /*...*/}
};

最佳答案

你不能。确实会导致意外的隐式转换。

但是,不允许进行意外的隐式转换,并且编译器将拒绝您的程序。但是,这并不会阻止编译器选择或考虑它。例子

 void f(Foo);
 void f(std::vector<Bar>);

 int main() {
   // ambiguous
   f({bar1, bar2, bar3});
 }

关于C++ 11 initializer_list构造函数标记为 "explicit",我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14805338/

10-11 05:08