虽然我认为“懒惰”的答案在您的情况下可能是正确的,但我只想指出,有时单个const
关键字不足以表达您的类的可变性细节。
考虑:
class MyClass {
public:
bool operator==(const MyClass &other) const {
return identity == other.identity;
}
void setVisible(bool vis) { gfx.setVisible(vis); }
bool isVisible() const;
// other methods ...
private:
string identity;
GraphicsData gfx;
}
我认为这段代码是合理的:
MyClass item = ...
item.setVisible(true);
// I want to call a function and be sure that the object's
// visibility did not change, so pass a const ref.
const MyClass &constRef = item;
someSafeFunction(constRef);
但同时,我认为这段代码也很合理:
// Imagine an appropriate std::hash<MyClass> has been
// defined, based on MyClass::identity.
unordered_set<MyClass> set = ...
// Hide some items
for (MyClass &item : set) {
item.setVisible(false);
}
但是,第二段代码将无法编译,因为unordered_set
只能const
引用其内容(现场示例)。这是因为对对象的修改可能会更改其哈希码,从而使其在容器中的位置无效。
所以实际上,unordered_set
要求operator==
和const
指的是相同的身份概念。但这不是我们在第一个用例中想要的。
问题是我们的代码有两个“对象是否改变”的概念,从不同的角度来看,它们都有意义。
但是const
您只能应用一个关键字,因此您必须选择一个,而另一种情况将受到影响。