10

C++ で、関数の戻り値の代入を強制する方法はありますか? つまり、メンバー関数 foo がある場合

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

main() で次のように呼び出すことができます

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

もっと簡単な電話をかけられますか

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

(戻り値を保存しない)どういうわけか「違法」?

または、定義を区別できますか

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

お時間をいただきありがとうございます。私の無知をお詫び申し上げます

4

4 に答える 4

7

g ++を使用している場合は、

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

ただし、これはエラーではなく警告になります。ただし、おそらく-Werror=*フラグを使用してエラーに変えることができます。サポートされているすべての関数属性については、ここを参照してください。

于 2012-10-02T15:17:31.827 に答える
3

簡単な答えはノーです。ただし、「強制」することもできます。

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

于 2012-10-02T15:08:09.913 に答える
3

いいえ、返されたオブジェクトに対して操作を強制する方法はありません。

いいえ、区別することはできません

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

呼び出しの内部(少なくとも、移植可能な標準的な方法ではありません。呼び出しスタックなどをハックすることはできますが、なぜそうするのですか)。

于 2012-10-02T15:02:28.723 に答える
2

判断する方法はありませんが、優れた静的分析ツールは、戻り値が無視されると警告を表示することがよくあります。私が使用しているものは、MSVC2010 に付属しています。

于 2012-10-02T15:03:13.263 に答える