あなたの場合、「怠惰」の答えはおそらく正しいと思いますが、1つの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);
}
ただし、コードの2番目のビットはコンパイルされません。これは、その内容への参照unordered_set
しか提供できないためです(実際の例)。これは、オブジェクトを変更するとハッシュコードが変更され、コンテナ内の場所が無効になる可能性があるためです。const
したがって、事実上、それをunordered_set
要求しoperator==
、const
同じアイデンティティの概念を参照しています。しかし、それは私たちが最初のユースケースで望んでいることではありません。
問題は、コードに「オブジェクトが変更されたか」という2つの概念があり、どちらも異なる観点から意味があることです。
const
ただし、適用できるキーワードは1つしかないため、1つを選択する必要があり、もう1つの場合は問題が発生します。