我想知道一个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,两者都不使用赋值.