一位同事和我正在讨论const或参考成员是否是正确的事情。 const和引用成员使类不可复制且不可移动,除非您编写自己的副本并移动忽略引用或const成员的运算符。我找不到一个忽略复制或移动某些成员只是因为它们是引用或const有意义的情况。
我认为拥有一个不可移动的对象很少在逻辑上是合理的,并且只是与该类是location invariant有关的选择。不可复制的对象更常见,但是使类不可复制的选择与它是否拥有逻辑上不可复制的资源,如果它代表唯一的所有权等有关。我想不出一个理由的唯一特征是拥有引用或const成员会暗示类应该具有这些特征中的任何一个(不可复制或不可移动)
他们是否应该使用?应该是一个而不是另一个吗?有什么例子?
答案 0 :(得分: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
或参考成员。