【发布时间】:2013-01-26 03:40:32
【问题描述】:
我可以使用显式和初始化列表 ctor 来确保像 {a} 这样的表达式不会导致意外的隐式转换吗?还有一个想法:应该我担心吗?写{a} 比简单地写a 不太可能是一个错误,但另一方面,从代码中可能仍不清楚我们正在通过隐式转换构造一个对象。
class Foo
{
explicit Foo (std::initializer_list<Bar> ilist) { /*...*/}
};
【问题讨论】:
-
取决于它是什么,我喜欢它。我喜欢能够使用
someFunctionWithVectorAsArgument({1, 2, 3});。 -
我同意,但我将 ilist 传递给另一个类的构造函数,这是我不知道的模板参数,我无法判断该类是否具有显式标记的构造函数,或者像您一样使用 {1,2,3} 是否安全。这就是我问的原因,我想知道它是否像不使用“显式”时所做的常见隐式转换一样危险
-
恕我直言,将
explicit放在初始化列表构造函数上总是是个坏主意。它没有任何优势,只会在合理尝试构造类型时导致混淆或意外错误。
标签: c++ c++11 initializer-list explicit-constructor