2012-10-02 12 views
9

gibt es eine Möglichkeit, in C++, die Zuweisung des zurückgegebenen Werts einer Funktion zu erzwingen? dh wenn ich eine Member-Funktion fooForce zurückgegebenes Objekt zugewiesen werden

class myClass{ 
    ... 
    public: 
    T1 foo(T2 x){T1 y; /*something*/ return y;}; 
} 

, die ich in der main() als

myClass obj; 
T1 a = obj.foo(x); //<-- 

kann ich

nicht mache den einfachen Anruf nennen kann
myClass obj; 
obj.foo(x); //<-- 

(das tut den zurückgegebenen Wert speichern) irgendwie "illegal"?

Alternativ kann ich die Definitionen von

T1 a = obj.foo(x); 
obj.foo(x); 

vielen Dank für Ihre Zeit und sorry für meine Unwissenheit

+1

Beim Verwerfen der Rückgabewerte ist nichts besonders falsch. Auch wenn es so einen Weg gab - was ist mit 'somefunc (obj.foo (x))'? – Cubic

+0

Was wollen Sie erreichen, das macht das notwendig? –

Antwort

3

Nein unterscheiden, gibt es keine Möglichkeit für eine zurückgegebene Objekt eine Operation zu erzwingen.

Und nein, man kann nicht unterscheiden zwischen

T1 a = obj.foo(x); 
obj.foo(x); 

innerhalb der Anrufe (zumindest nicht in einer tragbaren, Standard Art und Weise. Sie könnten mit Call-Stacks hacken und so, aber warum soll man) .

2

Es gibt keine Möglichkeit zu sagen, aber gute statische Analyse-Tools zeigen oft Warnungen, wenn Rückgabewerte ignoriert werden. Die, die ich verwende, die mit MSVC2010 kommt, tut sicherlich.

3

Einfache Antwort ist nein; Sie könnten jedoch "erzwingen":

Rückgabe Smart-Zeiger, der automatisch zerstört wird, wenn keine Referenzen hat. In destructor werfen Sie eine Ausnahme oder machen Sie einen assert() -Aufruf. Um einen Absturz bei korrekter Verwendung zu vermeiden, können Sie eine Variable in dieser Klasse verwenden und sie auf false setzen, wenn Sie sicher sind, dass Sie kein Objekt mehr benötigen und dies dem Destruktor sagt, dass er nichts mehr werfen soll. aber kein Fehler

+2

Dieser Mechanismus ist nett, aber natürlich ist eine Art "Laufzeit" -Check. Vielen Dank übrigens. – Acorbe

7

Wenn Sie g ++ verwenden, könnten Sie

T1 foo(T2 x) __attribute__ ((warn_unused_result)); 

Dies führt zu einer Warnung verwenden. Aber Sie könnten wahrscheinlich einige -Werror = * Flag verwenden, um es in einen Fehler zu verwandeln. Unter here finden Sie alle unterstützten Funktionsattribute.

+0

Das ist sehr nah an dem, was ich brauche. Ich könnte jedoch ein wenig unportierbar sein. Ich werde diesen Weg übrigens erforschen. Danke. – Acorbe

Verwandte Themen