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

cfa*_*771 7 c++ explicit-constructor initializer-list c++11

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

class Foo
{
    explicit Foo (std::initializer_list<Bar> ilist) { /*...*/}
};
Run Code Online (Sandbox Code Playgroud)

Joh*_*itb 3

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

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

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

 int main() {
   // ambiguous
   f({bar1, bar2, bar3});
 }
Run Code Online (Sandbox Code Playgroud)

  • @fr33domlover 我认为他对参数传递的形式感到困惑。初始化器列表初始化的“显式”规则与普通初始化的规则不同。所以`Foo f = a;`不会*考虑*`显式`构造函数(即它只会忽略它们),但是`Foo f = { a }`不会*允许*`显式`构造函数,但它*会考虑* 他们。 (2认同)