C ++ 11 initializer_list构造函数标记为“explicit”

时间:2013-02-11 03:10:45

标签: c++ c++11 initializer-list explicit-constructor

我可以使用显式的init-list ctor来确保像{a}这样的表达式不会导致意外的隐式转换吗?另一个想法是:应该我担心吗?写{a}不太可能是简单的a错误,但另一方面,我们通过隐式转换构建对象的代码仍然可能不清楚。

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

2 个答案:

答案 0 :(得分:2)

你做不到。 导致意外的隐式转换。

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

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

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

答案 1 :(得分:0)

你当然可以。你是否真的应该依赖于这种情况,尽管我认为这种情况很少见。