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

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

我能否将 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/

相关文章:

c++ - 如何写入通过映射迭代器访问的 ofstream

c++ - 初始化程序列表在 Visual Studio 2012 Update 2 CTP 4(3 月)中不起作用

c++ - 以 std::out_of_range: basic_string 类型的未捕获异常终止

c++ - 为什么 STL::list 复制添加到列表中的元素?

c++ - _O_WTEXT、_O_U16TEXT、_O_U8TEXT - 这些模式在 mingw 编译器中是否可行,是否有任何解决方法?

c++ - 注册表设计

c++ - 编译器不警告精度损失?

c++ - 为什么通过 weak_ptr 调用这么慢?

c++ - 为什么初始化列表只能用于声明?

c++ - 运算符 '=' 不匹配(std::array<T, 3> 和 std::initializer_list<T>)