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和移动语义在这里也可能有所帮助,但也许我错了.
标准的哪一部分明确禁止这一点,或者确实是编译器错误(不太可能)?
我阅读标准(N3290)说你push_back的有效.
23.2.3第16段(表101-可选序列容器操作)表示push_back只需要T它MoveInsertable.
23.2.1第13段定义MoveInsertable:以下表达式应有效:
allocator_traits<A>::construct(m, p, v);
20.6.8.2第5段指定默认情况下(例如,对于默认分配器)construct调用新位置 - 非常类似于您的期望.
问候,&rzej