【发布时间】:2014-10-24 09:27:05
【问题描述】:
假设我有一个类 Foo,它有一个指向 Bar 的私有指针:
class Foo
{
private:
Bar * bar;
public:
Foo () : bar (new Bar ())
{}
~Foo ()
{
delete bar;
}
};
如果指针 bar 永远不应重新分配给不同的实例,那么将指针本身设为 const 以阻止我(或维护者)将来这样做是有意义的:
private:
Bar * const bar;
只要有机会,我就喜欢这样做。
如果我想写一个移动构造函数,它看起来像这样:
Foo (Foo && f) :
bar (f.bar)
{
f.bar = NULL; // uh oh; f.bar is const.
}
我可以通过抛弃f.bar 的常量或不首先使其变为常量来“使错误消失”。这两件事都不是我想做的。我宁愿不完全删除 const ,因为它的存在是有原因的。另一方面,抛弃 constness 为我敲响了警钟,这是我通常不会做的事情。我的问题是:在这样的移动构造函数中抛弃常量是否被认为是可以接受的做法?有没有更好的方法我没有考虑过?
我觉得我的问题和这个问题不一样:Use const_cast to implement the move constructor
【问题讨论】:
-
如果您需要更改
bar,那么很明显它不应该是const。仔细考虑您的设计。 -
看起来你的班级不应该是可移动的。
-
在这里使用 const_cast 是未定义的行为。
-
@user657267 我想更改它的唯一时间是在移动构造函数中,并且仅在即将被删除的实例上。这足以阻止我使用 const 似乎很遗憾。
标签: c++ c++11 constants move-semantics