将从不可复制派生的对象放置到向量中
Emplace object derived from non-copyable into vector
我有保存指针并与他人共享的对象。移动它们很好,但复制不行。我想将它们存储在矢量和地图中。当 A
没有析构函数时,以下代码仅在 有效。但是我需要一个析构函数来清理我的指针。
#include <vector>
struct OnlyMove
{
OnlyMove(const OnlyMove&) = delete;
OnlyMove& operator=(const OnlyMove&) = delete;
OnlyMove(OnlyMove&&) = default;
OnlyMove& operator=(OnlyMove&&) = default;
protected:
OnlyMove() = default;
};
struct A : OnlyMove
{
A(int){}
~A(){} // makes compilation fail
};
int main()
{
std::vector<A> y;
y.emplace_back(1);
}
当我有一个析构函数时的错误:
/usr/local/include/c++/8.2.0/bits/stl_construct.h: In instantiation of 'void std::_Construct(_T1*, _Args&& ...) [with _T1 = A; _Args = {A}]':
…
error: use of deleted function 'OnlyMove::OnlyMove(const OnlyMove&)'
我不明白为什么。析构函数在这里起到什么作用?
你需要:
struct A : OnlyMove
{
A(int){}
A(A&&) = default; // need this
~A() {}
};
当你引入析构函数时,移动构造函数就消失了。没有移动构造函数或复制构造函数,它不能放在向量中。
编辑:移动构造函数最好是 noexcept
,否则 std::vector::resize
和 std::vector::push_back
在抛出异常时无法保证。
我有保存指针并与他人共享的对象。移动它们很好,但复制不行。我想将它们存储在矢量和地图中。当 A
没有析构函数时,以下代码仅在 有效。但是我需要一个析构函数来清理我的指针。
#include <vector>
struct OnlyMove
{
OnlyMove(const OnlyMove&) = delete;
OnlyMove& operator=(const OnlyMove&) = delete;
OnlyMove(OnlyMove&&) = default;
OnlyMove& operator=(OnlyMove&&) = default;
protected:
OnlyMove() = default;
};
struct A : OnlyMove
{
A(int){}
~A(){} // makes compilation fail
};
int main()
{
std::vector<A> y;
y.emplace_back(1);
}
当我有一个析构函数时的错误:
/usr/local/include/c++/8.2.0/bits/stl_construct.h: In instantiation of 'void std::_Construct(_T1*, _Args&& ...) [with _T1 = A; _Args = {A}]': … error: use of deleted function 'OnlyMove::OnlyMove(const OnlyMove&)'
我不明白为什么。析构函数在这里起到什么作用?
你需要:
struct A : OnlyMove
{
A(int){}
A(A&&) = default; // need this
~A() {}
};
当你引入析构函数时,移动构造函数就消失了。没有移动构造函数或复制构造函数,它不能放在向量中。
编辑:移动构造函数最好是 noexcept
,否则 std::vector::resize
和 std::vector::push_back
在抛出异常时无法保证。