【问题标题】:Are reference members good practice? Are const members?参考成员是好的做法吗?是 const 成员吗?
【发布时间】:2013-04-25 11:40:53
【问题描述】:

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

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

应该使用它们吗?应该是一个而不是另一个?有哪些例子?

【问题讨论】:

  • 我不认为他们使类不可复制或不可移动;它不能被复制/移动到,但它肯定可以被复制/移动它更像是“不可分配”而不是“不可复制”。
  • 我发现引用成员对于函数对象之类的东西非常有用。
  • 关于不可移动物体的好奇陈述。我会说通常没有理由使对象可移动。当然,实体对象永远不应该是可移动的,因为它们永远不会作为临时对象出现。并且使具有值语义的对象可移动是一种优化,它不一定适用于许多类型,并且意味着可移植性的重大损失(至少在今天),并增加了复杂性。事实上,我认为只有在分析器说你需要它时才应该使用可移动的。
  • 我赞同 Vaughn Cato 的声明。

标签: c++ reference constants const-correctness


【解决方案1】:

我想不出一个原因,是否有引用或 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 或引用成员。

【讨论】:

    猜你喜欢
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    • 2020-07-17
    • 1970-01-01
    • 2011-06-04
    • 1970-01-01
    • 2010-09-19
    • 2022-01-18
    相关资源
    最近更新 更多