【发布时间】:2014-05-24 05:02:22
【问题描述】:
考虑到来自en.cppreference.com 的关于std::vector::emplace_back 的引用
"在容器末尾追加一个新元素。该元素是 就地构造,即不执行复制或移动操作。 元素的构造函数调用方式完全相同 提供给函数的参数。”
以下示例:
#include <vector>
struct A
{
A(int){}
A(A const&) = delete;
};
int main()
{
std::vector<A> vec;
vec.emplace_back(1);
return 0;
}
在线vec.emplace_back(1);Visual Studio 2013/GCC报告:
错误 C2280: 'A::A(const A &)' : 试图引用已删除的函数
错误:使用已删除的函数'A::A(const A&)'
错误是否正确?你能解释一下为什么吗?
【问题讨论】:
-
std::vector 要求其包含的类型是可复制构造的。它没有解释为什么单个 emplace_back 会失败,但你会在某些时候遇到麻烦。
-
@heinrichj move-constructible.
-
@Angew 感谢您的更正;无论哪种方式,Visual C++ 目前都不支持隐式定义的移动构造函数,所以至少你仍然不走运。