我能否将 explicit 与 init-list 构造函数一起使用,以确保像 {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/