代码之家  ›  专栏  ›  技术社区  ›  ypnos

从不可复制派生的emplace对象到向量

  •  0
  • ypnos  · 技术社区  · 5 年前

    我有保存指针并与其他人共享它们的对象。移动它们很好,但复制不行。我想把它们存储在矢量和地图中。以下代码有效 只有 什么时候 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

    1 回复  |  直到 5 年前
        1
  •  3
  •   Michael Veksler    5 年前

    你需要:

    struct A : OnlyMove
    {
        A(int){}
        A(A&&) = default;  // need this
        ~A() {} 
    }; 
    

    当您引入Destructor时,move构造函数将消失。如果没有move构造函数或copy构造函数,则无法将其放置在向量中。

    编辑:移动构造函数最好是 noexcept ,否则 std::vector::resize std::vector::push_back 当抛出异常时没有保证。