C++ 修改常量参数引用

C++ 修改常量参数引用,c++,c++11,C++,C++11,好的,我有两个类,看起来像: class Item { private: HANDLE Parent; public: Item(const Item &I) = delete; Item(Item &&I) = delete; void SetParent(HANDLE Handle); Item& operator = (const Item &I) =

好的,我有两个类,看起来像:

class Item
{
    private:
        HANDLE Parent;

    public:
        Item(const Item &I) = delete;
        Item(Item &&I) = delete;
        void SetParent(HANDLE Handle);

        Item& operator = (const Item &I) = delete;
        Item& operator = (Item &&I);
};

void Item::SetParent(HANDLE Handle)
{
    this->Parent = Handle;
}

Item& Item::operator = (Item&& I) {/*Do Move Here*/}


class Box
{
    private:
        HANDLE Handle;

    public:
        void Add(const Item &I);
};

void Box::Add(const Item &I)
{
    I.SetParent(this->Handle);   //Error.. Item I is const.
}
我得到一个错误,即I是const,这是有道理的,但我需要一种方法来设置项I的父项,而不丢失在适当位置构造I的能力,如下所示:

Box B(Item());
而不是:

Item I;
Box B(I);

有没有办法在调用SetParent修改I的同时保持I的内联构造?

一个解决方案是将
Parent
成员声明为可变的,并使
SetParent
方法保持常量。下面提供了一个示例代码


这是否意味着我必须创建两个函数?一个只接受一个引用(非常量),另一个接受右值引用,这样我就不会丢失非内联构造?是的,它需要两个构造函数——或者只有一个,如果你能把它做成模板的话(请阅读“通用引用”)。
mutable
应该只用于不可见的状态——有或没有父级都不能通过“不可见状态”,至少对我来说是这样。嗯,我以前从未见过那个关键字可变。也许是因为好的原因,也许是因为坏的原因。这看起来真的很酷。我最后使用了前面提到的R值引用。不过我会接受这个,因为它激起了我的兴趣,也是目前唯一的答案。
typedef int HANDLE;

class Item
{
    private:
        mutable HANDLE Parent;

    public:
        Item(const Item &I) = delete;
        Item(Item &&I) = delete;
        void SetParent(HANDLE Handle) const;

        Item& operator = (const Item &I) = delete;
        Item& operator = (Item &&I);
};

void Item::SetParent(HANDLE Handle) const
{
    this->Parent = Handle;
}

class Box
{
    private:
        HANDLE Handle;

    public:
        void Add(const Item &I);
    public:
         Box(const Item &I) {
            Add(I);
         }
};

void Box::Add(const Item &I)
{
    I.SetParent(this->Handle);   //Error.. Item I is const.
}

int main(void) {
    return 0;
}