前端之家收集整理的这篇文章主要介绍了
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,两者都不使用赋值.
原文链接:https://www.f2er.com/c/119622.html