問題タブ [rule-of-zero]

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.

0 投票する
3 に答える
933 参照

c++ - Rule of Zero の C++11 構文を理解できない

私はゼロのルールを研究しており、ルールを示す最後のコードについて 2 つの質問があります。

  1. ハンドルを初期化するために括弧の代わりに中括弧を使用するのはなぜですか?
  2. module_handle = std::unique_ptr; を使用するとどうなりますか? この文脈で正確に意味するのは? それをtypedefに置き換えることは可能でしょうか?
0 投票する
1 に答える
712 参照

c++ - ゼロの法則を理解する

基本クラスがあり、派生クラスをコピー可能にしたくありません。すべてを明示するために、次のように実装します。

これはそのようなことをする正しい方法ですか?私の知識と私が読んだことによると、答えはイエスですが、本番システムに導入する前に確認したいと思います。


編集

結論として: 1) ほとんどの場合、ムーブ オペレータは削除しないでください。それは、「可動性を必要とするものは無数にある」からです。2) 抽象基底クラスの場合、コンパイラが特別なメンバー関数を生成できるようにし、必要に応じて削除を派生クラスに移動できるようにする方が安全です。

0 投票する
4 に答える
3619 参照

c++ - デストラクタが暗黙的な移動メソッドの生成を無効にするのはなぜですか?

私はこのブログを読んで、ゼロの法則が何を言っているのかを理解しようとしていました. IMO、独自のデストラクタを宣言する場合は、移動コンストラクタを作成し、割り当てをデフォルトとして移動することを忘れないでください。

「デストラクタの追加には、移動関数の生成を無効にするという副作用がありますが、ウィジェットはコピー可能であるため、移動を生成するために使用されたすべてのコードがコピーを生成するようになります。つまり、クラスにデストラクタを追加することで、おそらく-効率的な移動は、おそらく効率の悪いコピーに静かに置き換えられます。」

上記の Scott Meyers のテキストは、引用符の中にあり、いくつかの疑問が頭に浮かびます。

  • デストラクタを宣言すると移動セマンティクスが隠されるのはなぜですか?
  • デストラクタの宣言/定義は、移動セマンティクスまたはコピー コンストラクターとコピー代入のみを非表示にし、移動セマンティクスを非表示にしますか?
0 投票する
1 に答える
264 参照

c++ - 何もしないデストラクタを追加するだけで、コンパイル エラーが発生する可能性があります (std::move 周辺)。

学習中にstd::move、奇妙な問題を見つけました。

完全なプログラムに何もしないデストラクタだけを追加すると、コンパイル エラーが発生します。

ライブコード: https://ideone.com/UTR9ob

エラーは invalid initialization of non-const reference of type 'B&' from an rvalue of type 'std::remove_reference<B&>::type {aka B}'です。

質問:

  • (1) それを強制する C++ 構文のルールはどれですか? 言い換えれば、エラーは何を意味するのでしょうか?
  • (2) ほとんど何もしない (例: デバッグ ログを出力するだけ) デストラクタを に追加したい場合、代わりに 5 つのルールBに従う必要がありますか? いいえの場合、コンパイルするにはどうすればよいですか? という理由だけで 5 のルールに従うことは、私の意見ではあまりにも退屈で汚いことです。

ゼロのルールは良い習慣 だと思います。

しかし、この例からすると、違反するとコンパイルエラーになるというのは難しいルールのように思えます。