2015-10-13 5 views
8

例外は、オブジェクトの統計型をにコピーして、スローされたオブジェクトをコピー初期化します。例えば:スローされたオブジェクトをコピー初期化する必要があるのはなぜですか?

struct foo 
{ 
    foo() = default; 
    foo(const foo&) = delete; 
}; 

int main() 
{ 
    throw foo(); 
} 

Clang++ --std=c++14は、明示的に削除されたコピーコンストラクタを使用することはできないと文句を言い。代わりに移動で初期化できないのはなぜですか?

+0

答えがあるのでもう削除できませんが、「簡単なタイポグラフィエラー」のためにトピックを外すことに投票しています。私の問題はこれほど些細なものではありませんでしたが、移動コンストラクタを作成するのを忘れてしまったのは明らかです。 – zneak

+0

あなたの質問のおかげで、私は何かを学びました。それを閉じるために投票しないでください、決してそれを削除しないでください! –

答えて

9

タイプに移動コンストラクタがないため、移動できません。削除されたコピーコンストラクタは、暗黙的な移動コンストラクタを抑制します。

4

foo(foo&&);が不足しているためです。 deleteコピーコンストラクタを作成すると、コンストラクタも移動しています。

+0

移動コンストラクタは削除されず、存在しません。 –

+0

@JonathanWakely「削除されていない、ちょうど不足している」とは何ですか?コピーコンストラクタを削除すると、移動コンストラクタも暗黙的に削除されます。 – SergeyA

+0

@JonathanWakely:「削除された」という2つのわずかに異なる感覚。私は、自分が何をすることができ、できないのかを明確にすることが望ましいと思います。移動コンストラクタの定義など。 –

6

を次のようにコードを変更:

struct foo 
{ 
    foo() = default; 
    foo(const foo&) = delete; 
    foo(foo&&) = default; 
}; 

int main() 
{ 
    throw foo(); 
} 

読むthisは、 "暗黙的に宣言した移動コンストラクタ"。

3

標準から適用言い回し(N4296のも、まさにこのような、)このように概ね見える([class.copy]/9§):

をクラスXの定義がない場合場合や不履行として明示的に移動コンストラクタを宣言していない、1が暗黙的に宣言された場合のみ:

  • ユーザー宣言コピーctorのを持っていないX、

[...]

これは、コピーctorを削除済みとして定義すると、コピーctorが宣言されたことを意味します。

関連する問題