問題タブ [gotw]

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 投票する
2 に答える
650 参照

c++ - C++11 の型推論 vs const char *

GotW 94で、Herb Sutter は「クラシック C++」宣言を区別しています。

そして「モダン」スタイル

s彼は、 「autoスタイルがより正確なのタイプには微妙な違いがある」と語っています。[追加編集: コメントは、これが Sutter が実際に意味したことを公正に表現していない可能性があることを示唆しています。以下の説明を参照してください。]

しかし...違いは何ですか?const char *a が文字列リテラルを参照する正しい方法であるという印象を受けました。さらに、デバッガー (lldb) に問い合わせたところ、実際には型が同じであると思われるようです。

Sutter が言及している微妙な違いはどこにあるのでしょうか?

0 投票する
2 に答える
63 参照

c++ - C++ IntAtomicGet、GotW の理由

GotWの記事 #45で、Herb は次のように述べています。

この if 条件はスレッドセーフではありません。1 つには、"data_->refs > 1" の評価もアトミックではない可能性があります。もしそうなら、スレッド 2 が refs の値を更新している間にスレッド 1 が "data_->refs > 1" を評価しようとすると、data_->refs から読み取られた値は何か - 1、2、または何かになる可能性があります。それは元の値でも新しい値でもありません。

さらに、彼は data_->refs が 1 との比較と Unshareable との比較の間に変更される可能性があることを指摘しています。

さらに下に進むと、解決策が見つかります。

これで、同じ参照が両方の比較に使用され、問題 2 が解決されることがわかりました。しかし、なぜ IntAtomicGet? このトピックに関する検索では何も見つかりませんでした。すべてのアトミック操作は、読み取り、変更、書き込み操作に焦点を当てており、ここでは読み取りのみを行います。それで、私たちはただできるでしょうか...

...とにかく、最終的にはおそらく1つの命令に過ぎないのでしょうか?

0 投票する
2 に答える
1145 参照

c++ - PIMPL イディオムを使用すると、この型が不完全なのはなぜですか?

私は PIMPL イディオムを使用しています。具体的には、この投稿で提供されているテンプレートを使用しています。以下の一連のクラスを VS2015 Update 3 でコンパイルすると、コンパイル エラーが発生します。

エラー C2027 未定義の型 'C::C_impl' の使用 (ソース ファイル src\A.cpp のコンパイル)

エラー C2338 は不完全な型を削除できません (ソース ファイル src\A.cpp のコンパイル)

警告 C4150 不完全な型 'C::C_impl' へのポインターの削除。デストラクタが呼び出されていません (ソース ファイル src\A.cpp のコンパイル)

コメントを外すことでこれを解決できます。これによりC::~C()、何かが~C()自動生成を妨げていると思われますが、何がわかりません。このリファレンスによると、次のいずれかが true の場合、型 T のデストラクタは暗黙的に削除済みとして定義されます。

  1. T には、破棄できない非静的データ メンバーがあります (デストラクタが削除されているか、アクセスできません)。
  2. T には、破棄できない直接または仮想基底クラスがあります (削除された、またはアクセスできないデストラクタがあります)
  3. T は共用体であり、非自明なデストラクタを持つバリアント メンバを持っています。
  4. 暗黙的に宣言されたデストラクタは仮想 (基本クラスに仮想デストラクタがあるため) であり、割り当て解除関数 (演算子 delete() は、あいまいな、削除された、またはアクセスできない関数の呼び出しになります。

項目 #2、3、および 4 は明らかに には適用されません。また、 (の唯一のメンバー) がデストラクタを明示的に定義しているCため、#1 が適用されるとは思いません。pimpl<>C

誰かが何が起こっているのか説明してもらえますか?

ああ

Bh

チャンネル

A.cpp

C.cpp

完全を期すために、上記の投稿からの PIMPL 実装:

pimpl.h

PimplImpl.h

上記のコードに関する注意事項:

  • 私は自分のライブラリの消費者に公開Aし、内部に保持しようとしています。CB
  • ここには B.cpp はありません。空になります。