c – 对T的initializer_list赋值运算符要求

前端之家收集整理的这篇文章主要介绍了c – 对T的initializer_list赋值运算符要求前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想知道一个initializer_list< T>要求T有一个赋值运算符.下列
struct Foo
{
    Foo& operator=( const Foo& ) = delete;
};

std::vector<Foo> f = { Foo( ),Foo( ) };

编译于clang 3.4.2但在Visual Studo 2013上失败并出现“错误C2280:’Foo& Foo :: operator =(const Foo&)’:尝试引用已删除函数”.我假设clang在这里是正确的,但是想检查没有要求T可以分配.

解决方法

的std :: initializer_list< T>不要求T以任何方式分配,因为复制std :: initializer_list对象很浅 – 它不会复制底层数据.

您收到错误是因为MSVC 2013(及以下版本)不支持自动生成移动构造函数和移动赋值运算符.所以错误实际上来自std :: vector尝试从初始化列表中复制,而不是从初始化列表本身复制.

这仍然是一个问题,为什么错误被触发,因为std :: vector构造函数采用std :: initializer_list只需要类型为EmplaceConstructible和可能的MoveInsertable,两者都不使用赋值.

猜你在找的C&C++相关文章