[解決済み] Visual Studio 2013および2015でのC++コンパイラーエラーC2280「削除された関数を参照しようとした」。
質問内容
このスニペットは Visual Studio 2013 (Version 12.0.31101.00 Update 4) でエラーなくコンパイルされます。
class A
{
public:
A(){}
A(A &&){}
};
int main(int, char*)
{
A a;
new A(a);
return 0;
}
でコンパイルしている間に、Visual Studio 2015 RC (Version 14.0.22823.1 D14REL) でこのエラーになります。
1>------ Build started: Project: foo, Configuration: Debug Win32 ------
1> foo.cpp
1>c:\dev\foo\foo.cpp(11): error C2280: 'A::A(const A &)': attempting to reference a deleted function
1> c:\dev\foo\foo.cpp(6): note: compiler has generated 'A::A' here
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Visual Studio 2015に同梱されているコンパイラは、Copy Constructorを生成して、それをマークしていると思います。
=delete
というエラー C2280 が発生します(ちなみに msdn.microsoft.com でドキュメントを見つけることができません)。
さて、Visual Studio 2013ではコンパイル可能(コンパイラが自動生成したコードに依存しているので動作する)だが、Visual Studio 2015ではC2280のためにコンパイルできないコードベースがあるとすると、この問題を解決するにはどうすればよいでしょうか。
私は、クラス
A
というように
class A
{
public:
A(){}
A(A &&){}
A(const A&)=default;
};
ということです。
解決方法は?
class.copy]/7より、強調は私です。
<ブロッククオートクラス定義でコピーコンストラクタを明示的に宣言していない場合、明示的でないものが暗黙的に宣言されます。 クラス定義で移動コンストラクタまたは移動代入演算子を宣言している場合、暗黙のうちに宣言されたコピー演算子は、そのクラスで使用されます。 コンストラクタはdeletedとして定義されます。 そうでない場合はdefaultedとして定義されます(8.4)。後者は,次のような場合に非推奨となる。 クラスがユーザ宣言されたコピー代入演算子やユーザ宣言されたデストラクタを持っている場合。
コピー代入については、第18段落に同様の文言で同等のセクションがあります。つまり、あなたのクラスは本当に
class A
{
public:
// explicit
A(){}
A(A &&){}
// implicit
A(const A&) = delete;
A& operator=(const A&) = delete;
};
ということで、コピーコンストラクトができないのです。移動コンストラクタ/代入を提供しても、クラスをコピー可能にしたい場合は、それらの特別なメンバー関数を明示的に提供する必要があります。
A(const A&) = default;
A& operator=(const A&) = default;
また、移動代入演算子も宣言する必要があります。もし本当にこれらの特殊な関数が必要なら、おそらくデストラクタも必要になるでしょう。参照 5つのルール .
関連
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み】抽象クラス型の無効なnew-expression
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み】オブジェクト引数のない非静的メンバ関数の呼び出し コンパイラーエラー
-
[解決済み】リンカーエラーです。"リンカ入力ファイルはリンクが行われていないため未使用"、そのファイル内の関数への未定義参照
-
[解決済み】デバッグアサーションに失敗しました
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む
-
[解決済み】C++ - 適切なデフォルトコンストラクタがない [重複]。
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較
-
[解決済み】'std::cout'への未定義の参照
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む