2012-02-12 18 views
13

私は移動コンストラクタ/割り当てがスローされるかどうかに関していくつかの矛盾する記事を読んできました。移動コンストラクタはnoexceptである必要がありますか?

したがって、私は、移動コンストラクタ/割り当てが最終的なC++ 11標準をスローすることが許可されているかどうか尋ねたいと思います。

+0

移動コンストラクタがスローされないことについて標準で何も見ていませんでしたが、「Xクラスの暗黙的に宣言された移動コンストラクタは、 'X :: X(X &&)'私はそこにnoexceptを見ない。 –

+0

最後の草案では、関数に宣言された 'noexcept'は表示されません... – ronag

+0

@ronag:あなたは確信していますか? N3337を開いて "noexcept"を探してすぐにクラスの 'swap'機能を得たからです。 –

答えて

17

移動コンストラクタは一般にスローされますか?はい。 にする必要がありますか? No.

一般に、それらの中で行うことは何も投げる可能性のあるものではありません。メモリを割り当てたり、他のコードを呼び出すなどしてはいけません。移動コンストラクタを書く唯一の理由は、他の誰かのメモリポインタとオブジェクト参照を打ち消すことです。いくつかの基本型をコピーし、他のオブジェクトの値をNULLにする必要があります。それらのものは投げてはならない。

これは許可されていますが、それは良い考えではありません。あなたがそれをやっているなら、あなたの移動操作でやっていることを再考してください。

+0

移動コンストラクタでstl型をスローしないと仮定しますか?私がそれについて心配すべき唯一の場所はUSDです。 – ronag

+6

@ronag:std :: typeに移動コンストラクタで 'noexcept'がない場合、スローすることができます。具体的には、各コンテナには空のコンテナでもヒープ割り当てのエンドノードが含まれている必要があるため、ノードベースのコンテナの実装にはスローイングコンストラクタがあります。これらの同じコンテナの他の実装はこの設計を持たないため、noexceptの移動コンストラクタを持つことができます(そして許されています)。 –

関連する問題