問題タブ [cpp-core-guidelines]

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 に答える
14992 参照

c++ - gsl::not_null対 std::reference_wrapper対 T&

C++ コア ガイドラインが最近発表されました (おめでとうございます!)。私はgsl::not_null型について心配しています。I.12で述べたように: null であってはならないポインターを次のように宣言します。not_null

nullptr エラーの逆参照を回避するため。nullptr の冗長なチェックを回避してパフォーマンスを向上させるため。

...

ソースに意図を記載することで、実装者とツールは、静的分析を通じていくつかのクラスのエラーを見つけるなど、より優れた診断を提供し、分岐や null テストを削除するなどの最適化を実行できます。

意図は明らかです。ただし、そのための言語機能は既に用意されています。null にできないポインターは、参照と呼ばれます。また、一度作成された参照は再バインドできませんが、この問題は によって解決されstd::reference_wrapperます。

gsl::not_nullとの主な違いはstd::reference_wrapper、後者はポインターの代わりにのみ使用できることですが、前者は割り当て可能なものすべてで機能しnullptrます (F.17 からの引用 : 「null」が有効な値ではないことを示すには、not_null を使用してください):

not_null組み込みポインターだけではありません。、、、、およびその他のポインターのような型で機能しarray_viewます。 string_viewunique_ptrshared_ptr

次のような機能比較表を想像します。

T&:

  • 保存できませんnullptrか?-はい
  • 再バインド可能? -いいえ
  • ポインター以外の代わりに使用できますか? -いいえ

std::reference_wrapper<T>:

  • 保存できませんnullptrか?-はい
  • 再バインド可能? -はい
  • ポインター以外の代わりに使用できますか? -いいえ

gsl::not_null<T*>:

  • 保存できませんnullptrか?-はい
  • 再バインド可能? -はい
  • ポインター以外の代わりに使用できますか? -はい

最後に、ここに質問があります:

  1. これらの概念の違いについての私の理解は正しいですか?
  2. std::reference_wrapperそれはもう駄目ということですか?

PS私はタグを作成cpp-core-guidelinesしましguideline-support-libraryた。これについては、適切に願っています。

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

c++ - マップ、セットなどの array_view 代替

virtualコンテナ参照を返す関数がいくつかあるクラス階層があるとします。

現時点では、クラスの任意のサブクラスで実際にvectorset、またはを返すことしかできません。ただし、一部については、たとえば aを使用して、この制限を緩和できます。mapInterfacevectorgsl::array_view

問題は、array_view他のコンテナ タイプで使用するための代替手段があるかどうかです。基本的に私が欲しいのは、特定のコンテナー タイプを指定せずに、不変ビューとして機能する関数から返すことができる軽量オブジェクトだけです。std::seta を のようなものに押し込むことも理にかなっていますarray_viewが、サポートされている操作は少なくなります (たとえば、ランダムアクセスはありません)。mapは明らかに別の獣であり、別のviewサポートする連想ルックアップが必要mapになりますが、array_view<const std::pair<const int, int>>. 求めすぎですか?それとも、これを実装するための合理的な方法がありますか? それとも、そのような「ビュー」の既存の実装さえあるのでしょうか?

PS: 継承は前提条件ではありません。問題を提示する最も簡単な方法だと思いました。

0 投票する
1 に答える
1454 参照

c++ - gsl::array_view> std::vector から

クラスにメンバー変数std::vector<std::string>があり、 と の組み合わせを使用して、メンバー関数から不変ビューとしてそれを返したいとしgsl::array_viewますgsl::cstring_view。残念ながら、以下はコンパイルされません。

cstring_viewこれは、array_viewを作成できるコンテナーがないためです。だから私の質問は: type のメンバーのようなものを明示的に追加せずにそのような構造を使用する方法はありstd::vector<gsl::cstring_view<>>ますか?これは明らかに望ましくありませんか?

編集

そのような「変換」ビューは、より一般的に使用できるように思えます。実装定義のストレージ アプローチを公開せずに、生のポインターとしてクラスのユーザーに公開したいvectorなどの所有ポインターを持つことを検討してください。考え?std::vector<std::shared_ptr<T>>array_viewgsl::array_view<const T*>

0 投票する
1 に答える
696 参照

c++ - Unreal Engine プロジェクトで C++ Core Checker を使用するには?

C++ Core Checker の使用方法は次のとおりです: C++ Core Guidelines Checkers available for VS 2015 Update 1.

NuGet パッケージを正常にインストールしましたが、使用/有効化できません。UE によって生成されたプロジェクトのプロパティ ページには、静的解析に関連するオプションはありません。

Analyze → Run Code Analyze を試しても何も達成されません。

Analyze → Configure Code Analysis を試行すると、「現在、解析可能なプロジェクトがロードされていません」というメッセージが表示されます。

これらのプロジェクトが分析できないのはなぜですか? それを変更することは可能ですか?

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

c++ - gsl ライブラリの span と array_view の違いは何ですか?

最近のいくつかのカンファレンス プレゼンテーションで、Bjarne Stroustrup や他の人が、C++ とそれをサポートするいくつかのタイプの新しいコーディング ガイドラインについて言及しているのを耳にしました。

具体的には、関数へのパラメーターとしての代わりにの例span<T>(T* p, int n)を覚えています(話の 32:00 頃の時間)。を使用するという提案も覚えていますarray_view<T>。それらは2つの選択肢ですが、同じ概念ですか? それとも、私は物事を混乱させていて、実際にはそれほど関連していませんか?

私は、両者が何についてであるべきかについての権威ある定義を見つけることができないようです.

0 投票する
1 に答える
669 参照

c++ - gsl::not_null から移動する合法的な方法はありますか?

導入されたガイドライン サポート ライブラリnot_null<T>の目的は、ポインターのような型に不変条件を適用することです。ただし、動作しない既知の問題です。not_null<unique_ptr<T>>

私が見る限り、その理由はunique_ptr<T>コピー構築可能でnot_null<T>はなく、その T から移動するコンストラクターを持っていないということnot_null<T>です。それは不変であることを壊すため、どちらもデフォルト構築可能ではありません。を構築できたとしても、コピーできず、移動するとnullptrが残るためnot_null<unique_ptr<T>>、意味のある内部に到達することは不可能です。完璧な罠のようです。unique_ptrunique_ptrnot_null<T>

私はnot_null<T>、特定のコンテキスト、つまり範囲外になる直前にあるオブジェクトから合法的に移動できると主張しました。つまり、そこからの移動は、破棄前の最後のアクセスである必要があります。そうすれば、不変式が壊れているオブジェクトは、プログラムの残りの部分から観察できなくなります。not_null(自身のコードでのみ観察可能です。)

次の例では、 から移動できると仮定しnot_null<T>ます。

  1. not_null<unique_ptr<int>>f() から返された状態の状態は、そこから移動した後にリークできなかったという私の仮定は正しいですか (例として)?

  2. not_null<unique_ptr<int>>g() に渡された状態の状態は、そこから移動した後にリークできなかったという私の仮定は正しいですか (例として)?

  3. C++ 14/17 での移動の一般的なケースを禁止しながら、この特別な種類の移動を許可することは可能ですか?

0 投票する
1 に答える
1358 参照

c++ - GCC 4.9.x で使用できる GSL 実装はありますか?

Microsoft の (コア) ガイドライン サポート ライブラリの実装は、GCC 5.1 をサポートすると言われていますが、他のバージョンのサポートは指定していません。より高いバージョンは問題ないようです (とにかく、私の Debian Stretch では 5.3.1) - しかし、GCC 4.9.3 でのテストのビルドは失敗します。

  • 他の誰かが GSL を実装しましたか?
  • どうにかして MS GSL を使用できますか?
  • そうでない場合、安全なサブセットを使用できますか? (おそらくそうではありません、私は知っています)
  • そうでない場合、新しいコンパイラを使用している人だけがガイドラインをサポートするライブラリを使用できるのは問題ではありませんか? 古いコンパイラは C++11 または C++14 をサポートしているのに?