我可以将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/