c++ - 引用成员是好的做法吗?是常量成员吗?

标签 c++ reference constants const-correctness

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

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

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

最佳答案

I can't think of a reason the sole trait of having a reference or const member or not would imply that the class should have either of these traits (noncopyable or unmovable)

我认为前提是错误的。

拥有 const 数据成员或引用数据成员不会使类不可复制:它只是无法分配它或从以一种破坏性的方式。

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

但是,X 不是可复制分配或移动分配的事实并不影响构造这些对象拷贝的可能性,正如您所指出的out - 一个健全的运作。例如,下面的程序可以正常编译:

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)
}

编译器将为您隐式生成一个复制构造函数,移动将退化为拷贝。如果这种 move into copy 的退化不适合您类的语义,那么您可以考虑不使用 const 或引用成员。

关于c++ - 引用成员是好的做法吗?是常量成员吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16318754/

相关文章:

java - Java 是否为任何字符(如 SPACE)定义常量?

当一个常量取另一个常量值时,C++ 常量初始化

c++ - Box2d - 计算速度和角度冲量时出现问题

mysql - 如何计算两个别名的差异以进行排序

java - 递归方法中 ArrayList 的行为

c++ - 汽车和引用

C++ "error: passing ' const std::map<int, std::basic_string<char>>' as ' this' argument of ..."

c++ - 声明可变长度数组

C++ GET 方法未处理的异常错误执行数学运算

c++ - 有没有办法防止在派生类的实例上调用基类方法?