constメンバ関数の戻り値がconstであるべきかどうかについては、どのような経験則が良いでしょうか?ここで私がする傾向があるが、私は あいまいなシナリオと闘う。 1つの注意があなたが非対称のconst性を持っていたら、あなたは オブジェクトAを返すために、オブジェクトBを尋ね、その後、オブジェクトBを返すためにconstオブジェクトのAを求めることができる、と は、あなたが意図を回避するために管理してきたということですconstメンバ関数から返されるオブジェクトの定数
class foo
{
public:
// if the returned object is conceptually
// (and therefore usually literally but not even necessarily)
// owned by *this*,
// then a const ptr should be returned
const ownedByFoo *getOwnedByFoo() const { return m_ownedByFoo; }
ownedByFoo *getOwnedByFoo() { return m_ownedByFoo; }
// what's a poor boy to do here?
// veryRelatedToFoo might be a conceptual contemporary or parent
// of Foo. Note naming the function "find..." instead of "get.."
// since *get* implies the object holds it as a data member but
// that may not even be the case here. There could be a
// standalone container that associates foo and veryRelatedToFoo.
// Should constness be symmetrical here?
const veryRelatedToFoo *findVeryRelatedToFoo() const;
veryRelatedToFoo *findVeryRelatedToFoo();
// If the returned object is only (conceptually)
// peripherally related to *this*,
// the returned object probably shoudn't be const, even if
// foo happens to have one of these as a direct data member,
// since we don't want to give away the implementation details of
// Foo and it may hold peripherallyRelatedToFoo simply for performance
// reasons, etc.
peripherallyRelatedToFoo *findPeripherallyRelatedToFoo() const
...
};
オブジェクトのconstity。
技術的には、あなたはconst-ness契約で正しいですが、それは過度にリテラルな解釈です。オブジェクトを無邪気に(constのように)自分自身の部分を渡すように要求し、非constオブジェクトを(あなたの心臓のコンテンツに変更することができますか?)その方法はあなたのオブジェクトにトロイの木馬です。 あなたの2番目のポイントは良いです。私は人々が一般的にはオーバーロードされた署名に慣れていると思います。なぜなら、constや非constの状況では、どこでも同じgetメソッドを使用することができるからです。呼び出し元に考えることはしばしば良いことです。 –
@私は同意し、文字通りの解釈が混乱を避けることが分かりました。あなたが "銃を装備して"提供することで、あなたがその罠に入ったという議論が始まります(州の非constへのポインタ)。私は次のいずれかを提案するかもしれません:a)常にconst *を返すことを考えてください(あなたのセマンティクスを作ります)。 b)実際の状態のコピーを提供することを検討する。セマンティクスでそれを指定し、対応するコピーコストを支払う。 c)constオーバーロードをプライベートにすることを検討して、メソッドをconstオブジェクトに対して呼び出すことはできません。 –
...私は個人的には、あなたのオブジェクトのconst'nessに依存する戻り値のconst'nessについてあまりにもあいまいであることがわかります。 YMMV。 –