2012-10-02 7 views
9

C++では、関数の戻り値の代入を強制する方法はありますか?私は強制返されたオブジェクト

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

としてメンバー関数foo私は(メインに呼び出すことができます

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

)を持っている場合 はつまり、私は(単純なコール

myClass obj; 
obj.foo(x); //<-- 

を作ることができることはしていません戻り値を格納する)何らかの "違法"?

代わりに、私は自分の無知

+1

戻り値の破棄には特に問題はありません。また、そのような方法があったとしても、 'somefunc(obj.foo(x))'はどうでしょうか? – Cubic

+0

これを達成するために何を達成しようとしていますか? –

答えて

3

ないためにあなたの時間をありがとうございましたし、申し訳ありません

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

の定義を区別することができ、返されたオブジェクトに対する操作を強制する方法はありません。

そして、いや、あなたは通話の内側

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

を区別することはできません(少なくともないポータブル、標準的な方法で。あなたは、コールスタックと、そのようなでハック可能性がありますが、なぜでしょう) 。

2

通知方法はありませんが、良い静的分析ツールでは、戻り値が無視されると警告が表示されることがよくあります。 MSVC2010に付属しているものはもちろんあります。

3

単純な回答はノー;しかし、あなたはそれを強制することができます:

参照がないときに自動的に破壊される戻りスマートポインタ。デストラクタでいくつかの例外をスローするか、assert()を呼び出します。正しく使用されるとクラッシュするのを防ぐために、そのクラスの変数を使用して、オブジェクトが必要なくなったことを確かめ、デストラクタに何も投げないように指示するときにfalseに設定することができます。

+2

この機構は素晴らしいですが、もちろん「ランタイム」チェックのようなものです。 非常にbtwありがとうございます。 – Acorbe

7

あなたがG ++を使用している場合は、これはしかし警告、ないとエラーになります

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

を使用することができます。しかし、おそらく-Werror = *フラグを使ってエラーにすることができます。サポートされているすべての機能属性については、hereを参照してください。

+0

これは私が必要とするものに非常に近いです。私は少しでもポータブルではないかもしれない。私はこの方法を探求します。どうも。 – Acorbe

関連する問題