实际上不允许容器内的'const'值吗?

edA*_*a-y 4 c++ language-lawyer c++11

为什么我不能将带有const值的结构放在容器中std::vector(我理解编译器报告的技术原因,我只是不确定编译器/集合应该这样做)

例如,一些非常简单的事情:

struct sample {
    int const a;
};
std::vector<sample> v;
v.push_back( sample{12} );
Run Code Online (Sandbox Code Playgroud)

这给出了关于使用删除的错误(至少在GCC中)operator=.但我不明白为什么它应该使用operator=.构造此向量时,不需要使用复制运算符.如果它没有使用复制构造器就地新的,这是完全允许的.例如,以下是可以的:

sample a;
new (&a) sample{12};
Run Code Online (Sandbox Code Playgroud)

调用析构函数sample也没问题.也就是说,这种类型上有足够的允许操作来构造向量,但我无法这样做.我认为带有rvalue的C++ 11和移动语义在这里也可能有所帮助,但也许我错了.

标准的哪一部分明确禁止这一点,或者确实是编译器错误(不太可能)?

And*_*zej 6

我阅读标准(N3290)说你push_back的有效.

23.2.3第16段(表101-可选序列容器操作)表示push_back只需要TMoveInsertable.

23.2.1第13段定义MoveInsertable:以下表达式应有效: allocator_traits<A>::construct(m, p, v);

20.6.8.2第5段指定默认情况下(例如,对于默认分配器)construct调用新位置 - 非常类似于您的期望.

问候,&rzej