问题描述
我有一个类的副本构造函数被明确删除(因为A在内部使用指针,我不想陷入浅层复制陷阱):
I have a class whose copy constructors are explicitly deleted (because A uses pointers internally and I don't want to fall into shallow copy pitfalls):
class A {
public:
A(const A&) = delete;
A& operator=(const A&) = delete;
A(const B& b, const C& c);
}
现在我有一个向量 vector< A> ; aVector;
,我要插入元素 - 因此我使用 emplace_back
:
Now I have a vector of type vector<A> aVector;
and I want to insert elements into it - so I use emplace_back
:
aVector.emplace_back(b, c);
但是,这无法使用gcc编译,我得到错误 -
However, this fails to compile using gcc and I get the error -
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&& ...)
b $ b
这个错误的原因是什么,如何在不删除复制构造函数的情况下修复它?我需要一个移动构造函数 - 是否需要显式定义?
What is the reason for this error and how can it be fixed without removing the deletion of the copy constructors? Do I need a move constructor - does it need to be explicitly defined?
推荐答案
$ c> std :: vector :: emplace_back 可以做重定位,这需要复制/移动构造函数。或者只需使用 std :: deque
。
You should add move constructor - because std::vector::emplace_back
may do relocation which requires copy/move constructor. Or just use std::deque
.
#include <vector>
#include <deque>
using namespace std;
struct NoCopyNoMove
{
NoCopyNoMove(const NoCopyNoMove&) = delete;
NoCopyNoMove& operator=(const NoCopyNoMove&) = delete;
NoCopyNoMove(NoCopyNoMove&&) = delete;
NoCopyNoMove& operator=(NoCopyNoMove&&) = delete;
NoCopyNoMove(int){};
};
struct OnlyMove
{
OnlyMove(const OnlyMove&) = delete;
OnlyMove& operator=(const OnlyMove&) = delete;
OnlyMove(OnlyMove&&) noexcept {}
OnlyMove& operator=(OnlyMove&&) noexcept {}
OnlyMove(int){};
};
int main()
{
deque<NoCopyNoMove> x;
x.emplace_back(1);
vector<OnlyMove> y;
y.emplace_back(1);
}
a.emplace_back(args)
[.. 。]
需要: T
应为 EmplaceConstructible
转换为来自args的 X
。 向量
, T
也应为转换为 X
。
Requires: T
shall be EmplaceConstructible
into X
from args. For vector
, T
shall also be MoveInsertable
into X
.
这篇关于插入到具有对象而没有副本构造函数的向量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!