【发布时间】:2013-11-18 12:48:45
【问题描述】:
我有一个类,其复制构造函数被显式删除(因为 A 在内部使用指针,我不想陷入浅拷贝陷阱):
class A {
public:
A(const A&) = delete;
A& operator=(const A&) = delete;
A(const B& b, const C& c);
}
现在我有一个 vector<A> aVector; 类型的向量,我想在其中插入元素 - 所以我使用 emplace_back:
aVector.emplace_back(b, c);
但是,使用 gcc 编译失败,我得到了错误 -
third-party/gcc-4.7.1-glibc-2.14.1/libgcc/libgcc-4.7.1/afc21dc/include/c++/4.7.1/bits/stl_construct.h: In instantiation of 'void std::_Construct(_T1*, _Args&& ...)
third-party/gcc-4.7.1-glibc-2.14.1/libgcc/libgcc-4.7.1/afc21dc/include/c++/4.7.1/bits/stl_uninitialized.h:77:3: required from 'static _ForwardIterator std::__uninitialized_copy<_TrivialValueTypes>::__uninit_copy(_InputIterator, _InputIterator, _ForwardIterator)
third-party/gcc-4.7.1-glibc-2.14.1/libgcc/libgcc-4.7.1/afc21dc/include/c++/4.7.1/bits/stl_uninitialized.h:119:41: required from '_ForwardIterator std::uninitialized_copy(_InputIterator, _InputIterator, _ForwardIterator)
third-party/gcc-4.7.1-glibc-2.14.1/libgcc/libgcc-4.7.1/afc21dc/include/c++/4.7.1/bits/stl_uninitialized.h:260:63: required from '_ForwardIterator std::__uninitialized_copy_a(_InputIterator, _InputIterator, _ForwardIterator, std::allocator<_Tp>&)
third-party/gcc-4.7.1-glibc-2.14.1/libgcc/libgcc-4.7.1/afc21dc/include/c++/4.7.1/bits/stl_uninitialized.h:283:67: required from '_ForwardIterator std::__uninitialized_move_if_noexcept_a(_InputIterator, _InputIterator, _ForwardIterator, _Allocator&)
third-party/gcc-4.7.1-glibc-2.14.1/libgcc/libgcc-4.7.1/afc21dc/include/c++/4.7.1/bits/vector.tcc:410:6: required from 'void std::vector<_Tp, _Alloc>::_M_emplace_back_aux(_Args&& ...)
third-party/gcc-4.7.1-glibc-2.14.1/libgcc/libgcc-4.7.1/afc21dc/include/c++/4.7.1/bits/vector.tcc:102:4: required from 'void std::vector<_Tp, _Alloc>::emplace_back(_Args&& ...)
这个错误的原因是什么?如何在不删除复制构造函数的情况下修复它?我是否需要移动构造函数 - 是否需要显式定义?
【问题讨论】:
-
你如何定义
A(const B& b, const C& c);? -
我自己也遇到过同样的问题,对我来说这是因为复制省略实现。必须提供 copy-ctor,但从未调用过。我刚刚测试了您的布局,并在我的 Mac 上使用
clang-500.2.79遇到了与您在此处显示的相同的问题。提供一个 copy-ctor 允许它编译,但从不调用实现的 copy-ctor。同样提供一个 move-ctor。我必须清理问题历史才能找到相关问题。一旦你到达向量中的一个扩展点,移动构造将被调用(如果可用),所以无论如何你最好添加它。 -
您应该添加移动构造函数 - 因为
vector的emplace_back可能会进行需要复制/移动构造函数的重定位。或者只使用std::deque。