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

对具有禁用的复制构造函数/赋值的对象的引用

  •  0
  • folibis  · 技术社区  · 4 年前

    在我的应用程序中,我有一个对象列表。因为我必须只有一个实例,所以我禁用了复制构造函数和赋值运算符。仍然允许移动对象。但是由于我对对象执行了各种操作,所以我需要存储指向其中一个对象的指针。在我使用指针之前,但是我现在想使用一个引用。

    由于某些原因,我无法重新分配引用。错误:

    error: overload resolution selected deleted operator '='
    candidate function has been explicitly deleted
    

    #include <iostream>
    
    class Item
    {
    public:
        Item() { n = (++Item::counter); }
        Item(const Item&& other) { n = std::move(other.n); }
        Item(const Item& other) = delete;
        Item& operator=(const Item& other) = delete;
        int Get() { return n; }
    private:
        int n;
        static int counter;
    };
    
    int Item::counter = 0;
    
    int main()
    {
        Item i1;
        Item i2;
    
        Item *p = &i1;
        printf("%d\n", p->Get());
    
        p = &i2;
        printf("%d\n", p->Get());
    
        Item &r = i1;
        printf("%d\n", r.Get());
    
        r = i2; // here I get the error
        printf("%d\n", r.Get());
    
        return 0;
    }
    

    好吧,我可以理解如果我在这样的事情上出错:

    Item i3 = i2;
    

    i、 如果真的有任务。但这里我只想存储一个对对象的引用,而不是将它分配或复制到另一个对象。

    0 回复  |  直到 4 年前
        1
  •  4
  •   bartop    4 年前

    Item i1;
    Item i2;
    Item &r = i1;
    r = i2; 
    

    逻辑上等同于:

    Item i1;
    Item i2;
    i1 = i2; 
    

    std::reference_wrapper 这是您想要的-可重新绑定引用类型:

    Item i1;
    Item i2;
    auto r = std::ref(i1);
    r = std::ref(i2);