4

我和一位同事正在争论 const 或 reference 成员是否是正确的做法。const 和 reference 成员使类不可复制和不可移动,除非您编写自己的忽略引用或 const 成员的复制和移动运算符。我找不到仅仅因为它们是引用或 const 而忽略复制或移动某些成员的情况。

我认为拥有一个不可移动的对象在逻辑上很少是合理的,并且是一个只与类是否位置不变有关的选择。不可复制的对象更为常见,但是使类不可复制的选择与它是否拥有逻辑上不可复制的资源,如果它代表唯一的所有权等有关。我想不出唯一的原因是否具有引用或 const 成员意味着该类具有这些特征中的任何一个(不可复制或不可移动)

他们应该使用吗?应该是一个而不是另一个?什么是例子?

4

1 回答 1

5

我想不出具有引用或 const 成员的唯一特征是否意味着该类应该具有这些特征中的任何一个(不可复制或不可移动)的原因

我认为前提是错误的。

拥有const数据成员或引用数据成员不会使类不可复制:它只是使分配它或以破坏性方式从它移动变得不可能。

那是因为破坏性移动操作对于const对象或引用来说是不合理的:这将违反它们的语义,因为const对象的状态永远不会被改变,并且引用不能被解除绑定。

但是,X不可复制分配或移动分配的事实并不会影响构造这些对象的副本的可能性,正如您所指出的那样,这是一个合理的操作。例如,以下程序可以正常编译:

struct X
{
    X() : x(0), rx(x) { }

    const int x;
    const int& rx;
};

int main()
{
    X x;
    X x1 = x; // Copy-initialization (copy-constructs x1 from x)
    X x2 = X(); // Copy-initialization (copy-constructs x2 from a temporary)
}

编译器将为您隐式生成一个复制构造函数,并且移动将退化为副本。如果这种移入副本的退化不适合您的类的语义,那么您可以考虑不拥有const或引用成员。

于 2013-05-01T13:16:49.890 回答