問題タブ [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.
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_view
unique_ptr
shared_ptr
次のような機能比較表を想像します。
T&
:
- 保存できません
nullptr
か?-はい - 再バインド可能? -いいえ
- ポインター以外の代わりに使用できますか? -いいえ
std::reference_wrapper<T>
:
- 保存できません
nullptr
か?-はい - 再バインド可能? -はい
- ポインター以外の代わりに使用できますか? -いいえ
gsl::not_null<T*>
:
- 保存できません
nullptr
か?-はい - 再バインド可能? -はい
- ポインター以外の代わりに使用できますか? -はい
最後に、ここに質問があります:
- これらの概念の違いについての私の理解は正しいですか?
std::reference_wrapper
それはもう駄目ということですか?
PS私はタグを作成cpp-core-guidelines
しましguideline-support-library
た。これについては、適切に願っています。
c++ - マップ、セットなどの array_view 代替
virtual
コンテナ参照を返す関数がいくつかあるクラス階層があるとします。
現時点では、クラスの任意のサブクラスで実際にvector
、set
、またはを返すことしかできません。ただし、一部については、たとえば aを使用して、この制限を緩和できます。map
Interface
vector
gsl::array_view
問題は、array_view
他のコンテナ タイプで使用するための代替手段があるかどうかです。基本的に私が欲しいのは、特定のコンテナー タイプを指定せずに、不変ビューとして機能する関数から返すことができる軽量オブジェクトだけです。std::set
a を のようなものに押し込むことも理にかなっていますarray_view
が、サポートされている操作は少なくなります (たとえば、ランダムアクセスはありません)。map
は明らかに別の獣であり、別のview
サポートする連想ルックアップが必要map
になりますが、array_view<const std::pair<const int, int>>
. 求めすぎですか?それとも、これを実装するための合理的な方法がありますか? それとも、そのような「ビュー」の既存の実装さえあるのでしょうか?
PS: 継承は前提条件ではありません。問題を提示する最も簡単な方法だと思いました。
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_view
gsl::array_view<const T*>
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 を試行すると、「現在、解析可能なプロジェクトがロードされていません」というメッセージが表示されます。
これらのプロジェクトが分析できないのはなぜですか? それを変更することは可能ですか?
c++ - gsl ライブラリの span と array_view の違いは何ですか?
最近のいくつかのカンファレンス プレゼンテーションで、Bjarne Stroustrup や他の人が、C++ とそれをサポートするいくつかのタイプの新しいコーディング ガイドラインについて言及しているのを耳にしました。
具体的には、関数へのパラメーターとしての代わりにの例span<T>
(T* p, int n)
を覚えています(話の 32:00 頃の時間)。を使用するという提案も覚えていますarray_view<T>
。それらは2つの選択肢ですが、同じ概念ですか? それとも、私は物事を混乱させていて、実際にはそれほど関連していませんか?
私は、両者が何についてであるべきかについての権威ある定義を見つけることができないようです.
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_ptr
unique_ptr
not_null<T>
私はnot_null<T>
、特定のコンテキスト、つまり範囲外になる直前にあるオブジェクトから合法的に移動できると主張しました。つまり、そこからの移動は、破棄前の最後のアクセスである必要があります。そうすれば、不変式が壊れているオブジェクトは、プログラムの残りの部分から観察できなくなります。not_null
(自身のコードでのみ観察可能です。)
次の例では、 から移動できると仮定しnot_null<T>
ます。
not_null<unique_ptr<int>>
f() から返された状態の状態は、そこから移動した後にリークできなかったという私の仮定は正しいですか (例として)?not_null<unique_ptr<int>>
g() に渡された状態の状態は、そこから移動した後にリークできなかったという私の仮定は正しいですか (例として)?C++ 14/17 での移動の一般的なケースを禁止しながら、この特別な種類の移動を許可することは可能ですか?
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 をサポートしているのに?