gon*_*ing 7 c++ initializer-list c++11
我想知道是否 initializer_list<T>要求T有一个赋值运算符.下列
struct Foo
{
Foo& operator=( const Foo& ) = delete;
};
std::vector<Foo> f = { Foo( ), Foo( ) };
Run Code Online (Sandbox Code Playgroud)
在clang 3.4.2上编译但在Visual Studo 2013上失败了"error C2280: 'Foo &Foo::operator =(const Foo &)' : attempting to reference a deleted function".我假设clang在这里是正确的,但是想检查没有要求T可以分配.
std::initializer_list<T>不需要T以任何方式分配,因为复制std::initializer_list对象很浅 - 它不会复制基础数据.
您收到错误是因为MSVC 2013(及以下版本)不支持自动生成移动构造函数和移动赋值运算符.因此,错误实际上来自于std::vector尝试从初始化列表复制,而不是从初始化列表本身复制.
这仍然是一个问题,为什么错误被触发,因为std::vector构造函数std::initializer_list只需要类型,EmplaceConstructible并且可能MoveInsertable,它们都不使用赋值.