問題タブ [deleted-functions]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - デフォルトのコピー コンストラクターを使用したエラー:「deleted function」
g++ 5.1.0 を使用して、次の C++14 プログラムをコンパイルしていますtest.cpp
。
コンパイルしようとすると、次のエラーが発生します。
コピー コンストラクターが存在し、削除されていないことは明らかであるため、この問題の診断をどこから開始すればよいかわかりません。これの原因は何ですか?
c++ - 「一般的な」ケースが削除された特殊なテンプレート関数は、g++ <=4.8.0 および clang++ でコンパイルに失敗します
古いバージョンの g++ (4.8.0、MinGW) でプロジェクトをコンパイルすると、次のコードがコンパイルに失敗することがわかりました。
基本ケースが削除されていることがわかった場合、g++ は明示的な特殊化を探そうとさえしないようです。
代わりに、g++ 4.8.4 および 5.2 (Linux 上) は文句を言いません。これは古いバージョンのコンパイラのバグですか、それとも標準の灰色の領域ですか?
補遺
clang 3.4.1 も気に入らないようです:
(そして、コメントの@Baum mit Augenは、3.7ではまだ機能しないと報告しています)
c++ - static_assert で関数を禁止します
特定の関数が呼び出されないようにしたい。関数ポインタなどを介して関数を呼び出すケースは無視して、関数を直接呼び出すケースだけに集中しましょう。でこれを行うことができます= delete
。ただし、発行された診断はあまり有益ではありません。static_assert
カスタム診断メッセージを提供できる を使用することを検討しました。static_assert(false, ...)
関数が呼び出されたときに実行されることを期待して、関数本体内にステートメントを配置しました。ただし、static_assert
関数が呼び出されなくても失敗することがわかりました。助言がありますか?
追記:無条件に禁止されている機能です。したがって、std::enable_if
ここでは適用されません。このような関数の動機は、特定の使用を防止したいということです。それ以外の場合は、オーバーロード解決で正常にコンパイルされます。したがって、機能を削除することはできません。deprecated
私が欲しいものではありません。警告ではなく、コンパイル エラーが必要です。
c++ - 参照修飾子と削除されたメンバー メソッド
次のコードを検討してください。
もちろん、メンバーメソッドをオーバーロードできないと言ってコンパイルしません。もちろん、それは理にかなっています。
反対側では、次のコードがコンパイルされます。
それは法規ですか?
同じクラス内で 2 つの完全に異なるインターフェイスを定義することは可能ではないでしょうか。前者は左辺値で使用され、後者は右辺値で使用されますか?
それがあまり意味をなさないという事実は別として、それは本当に私を傷つけます. 削除された関数は、左辺値の場合にのみ削除する
のではなく、全体として削除するべきではありませんか?
この機能の目的は何ですか? それは古典的な目立たないコーナーケースですか、それとも私には見えない何かがありますか?
c++ - ostringstream メンバーを含むオブジェクトを構築できないのはなぜですか?
大規模なプロジェクトから簡略化した次のクラスの例があります。これは、ロガーのスコープを使用してデストラクタでログ エントリを終了するロギング フレームワークに基づいています。
以下のコードは、コンストラクターが暗黙的に削除された関数 ( edit: not true ) であるため、コンパイルされません。これは、std::ostringstream
オブジェクトと関係があるようです。を直接構築できるはずだと思うので、私はそれについて混乱しています。つまり、オブジェクトstd::ostringstream
を直接構築できるはずです。Container
「works fine」というラベルの付いた行がまさにそれを行っていることに注意してください。「世界」を出力するために直接アクセスできるContainer
new を含む匿名オブジェクトをインスタンス化するようです。std::ostringstream
それContainer
自体がメッセージの「Hello」部分を作成し、そのデストラクタがバッファをフラッシュします。
Container
オブジェクトに名前を付けて保存する 2 番目の部分が正しく実行されないのはなぜですか? これが私が得るエラーのサンプルです:
... 等々。
c++ - unique_ptr の 2 つのベクトルをマージする場合の「削除された関数の使用」
の 2 つのベクトルをマージしようとしていますunique_ptr
(つまり、1 つのベクトルstd::move
から別のベクトルへ)。「削除された関数の使用...」というエラー テキストの壁に遭遇し続けます。エラーによると、unique_ptr
削除された のコピー コンストラクターを使用しようとしているようですが、その理由はわかりません。以下はコードです:
c++ - デフォルトのムーブ コンストラクター/代入および削除されたコピー コンストラクター/代入
規格によると、
クラス X の定義でムーブ コンストラクターが明示的に宣言されていない場合、1 つが暗黙的にデフォルトとして宣言されます。
— X にはユーザー宣言のコピー コンストラクターがありません。
— X には、ユーザー宣言のコピー代入演算子がありません。
— X にはユーザー宣言の移動代入演算子がなく、かつ
— X にはユーザー宣言のデストラクタがありません。
現在、以下はコンパイルに失敗します
したがって、削除された関数はユーザー定義と見なされるようです。これは理にかなっています (デフォルトの実装ではありません)。ただし、その特定のケースでは、削除されたコピー コンストラクター/代入の混乱はどのようにデフォルトの移動コンストラクター/代入になるでしょうか?
手動生成と esp. このようなデフォルト関数のメンテナンスはエラーが発生しやすいと同時に、std::unique_ptr
クラス メンバーなどのクラスの使用が (正当に) 増加したことで、コピー不可能なクラスが以前よりもはるかに一般的な獣になりました。
c++ - C++: fstream を引数として渡そうとすると関数が削除されましたか?
私のコードの何が問題なのかわかりません。コンソールから 2 つのファイルのファイル パスを取得しようとしています。次に、それらのファイルを使用していくつかの fstream オブジェクトを初期化し、1 つには fstream オブジェクトを初期化しios::in | ios::out
、もう 1 つには追加しios::binary
ます。
私のコードの重要な部分は次のとおりです。
ただし、Visual Studio は、INPUT_DATA(dataFile);
andINPUT_TARGETS(targetsFile);
の部分で次のように叫びます。
行 1244 が見つかるまでヘッダー ファイルを調べました。
なぜこれが起こっているのか分かりません。私はまだC++にかなり慣れていないので、ばかげたことをしただけかもしれませんが、誰か助けてもらえますか?
編集:明確なタイトル