Was ist eine gute Faustregel, ob der Rückgabewert einer const Member-Funktion const sein sollte oder nicht? Hier ist, was ich tendiere zu tun, aber ich kämpfe mit mehrdeutigen Szenarien.Konstanz des zurückgegebenen Objekts (s) aus einer const Member-Funktion
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
...
};
Ein weiterer Hinweis ist, dass, sobald Sie asymmetrische Konstantheit haben, Sie Ein konstantes Objekt fragen konnte Objekt B zurück, dann Objekt B fragen Objekt A zurückzukehren, und dann haben Sie es geschafft, die dazu bestimmt umgehen Beschaffenheit des Objektes A.
Technisch gesehen haben Sie Recht mit dem Const-ness-Vertrag, aber das ist eine übermäßig wörtliche Interpretation. Wenn Sie ein Objekt unschuldig (wie in const) bitten, ein Stück von sich selbst zu übergeben, und erhalten Sie (eine geladene Waffe in Form von) ein nicht-konstantes Objekt, das Sie dann nach Herzenslust modifizieren können? Diese Methode ist ein trojanisches Pferd in dein Objekt. Ihre 2nd pt ist gut. Ich denke, die Leute sind im Allgemeinen an die überladene Signatur gewöhnt, weil sie die gleiche get-Methode überall in const und non-const verwenden können, ohne darüber nachzudenken, aber den Anrufer darüber nachzudenken, ist oft eine gute Sache –
@ No-Op, Sicher, ich stimme zu und ich finde, dass die wörtliche Interpretation Verwirrung verhindert. Es kann argumentiert werden, dass Sie in diese Falle gegangen sind, indem Sie zunächst eine geladene Waffe zur Verfügung gestellt haben (einen Zeiger auf einen Nicht-Konstanten Ihres Zustands). Ich könnte entweder vorschlagen: a) Betrachte immer eine const * (mach das zu deiner Semantik). b) Überlegen Sie, ob Sie eine Kopie des tatsächlichen Zustands bereitstellen; Geben Sie das in Ihrer Semantik an und zahlen Sie die entsprechenden Kopierkosten. c) Überlegen Sie, ob die Konstante const privat ist, damit die Methode nicht für ein const-Objekt aufgerufen werden kann. –
... Ich persönlich finde es zu dunkel, dass die Konstanz des Rückgabewerts von der Beschaffenheit Ihres Objekts abhängt. YMMV. –