这个问题已经有了答案:
我有保存指针并与其他人共享它们的对象。移动它们很好,但复制不行。我想把它们存储在矢量和地图中。以下代码有效 只有 什么时候 A 没有析构函数。不过,我需要一个析构函数来清理指针。
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); }
当我 有 析构函数:
/Ur/Prime/Cu+//82.0/BIT/STLY.Huffic。h:在空虚STD:实例化:(x,t1*,γARG&&&……)[与αT1= A;γARG= {A} ]: 艾斯 错误:使用已删除的函数“onlymove::onlymove(const onlymove&)”
我不明白为什么。毁灭者在这里扮演什么角色?
Live Demo
你需要:
struct A : OnlyMove { A(int){} A(A&&) = default; // need this ~A() {} };
当您引入Destructor时,move构造函数将消失。如果没有move构造函数或copy构造函数,则无法将其放置在向量中。
编辑:移动构造函数最好是 noexcept ,否则 std::vector::resize 和 std::vector::push_back 当抛出异常时没有保证。
noexcept
std::vector::resize
std::vector::push_back