对T的initializer_list <T>赋值运算符要求

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可以分配.

Rei*_*ica 6

std::initializer_list<T>不需要T以任何方式分配,因为复制std::initializer_list对象很浅 - 它不会复制基础数据.

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

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