問題タブ [guideline-support-library]
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++ - 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++ - gsl::span が std::regex でコンパイルに失敗する
gsl::span
混合バイナリ/ASCIIデータのパックされた構造(したがって novector
またはstring
)から正規表現で操作したい関数にデータを渡すために使用しようとしていますが、次のエラーが発生します:
エラー C2784: 'bool std::regex_match(_BidIt,_BidIt,std::match_results<_BidIt,_Alloc> &,const std::basic_regex<_Elem,_RxTraits> &,std::regex_constants::match_flag_type)': 推定できませんでした'std::cmatch' からの 'std::match_results>,_Alloc> &' のテンプレート引数
「std::regex_match」の宣言を参照してください
これが私がやろうとしていることです:
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 をサポートしているのに?
c++ - range-v3 で gsl::span を使用する
GSL と range-v3 ライブラリに慣れるために、ちょっとした例を試してみましたが、どうすればそれらを連携させることができるのだろうと思いました。私はこのおもちゃの例を持っています
動作します。しかし、範囲として使用しようとするgsl::span<int>
と、エラー メッセージが表示されます。コンパイラはspan
、ビューの概念を満たしていないことを教えてくれます。
コンパイラ メッセージ:
しかし、私の理解では、 aspan
は特定のビューであり、 (同じ型の)begin()
およびend()
イテレータさえあるため、そうすべきです。
- それらが構成可能で一緒に動作するのはクールではないでしょうか? それとも、両方に互換性がない理由がありますか?
- これは、range-v3 での強力な「概念」の使用に起因する問題だと思います。他の種類の概念機能が言語でサポートされている場合、自動的に解決されますか?
span
両方のライブラリを(非産業用の)ソフトウェアで一緒に使用したい場合は、現在、何らかの適応が必要であると思います。これらを連携させるには、何を変更すればよいですか? (それがまったく良い考えであれば)- それはまた、最終的に「作業するために満たすべきクラスは何
range-v3
ですか?」という質問に私を導きます。ファサード、アダプターなどからの継承は、現在、これらの概念的な要件についてコンパイラーに伝える唯一の方法ですか?
c++ - 致命的なエラー C1001: コンパイラで内部エラーが発生しました
VS2013 に意図的に gsl.h を組み込んでみました。プロジェクトをビルドしようとすると、
c:\users\njain6\documents\visual studio 2013\projects\gcldemo\string_span.h(336): 致命的なエラー C1001: コンパイラで内部エラーが発生しました。
私が従った手順:
- Github から zip ファイルをダウンロードしました。
- プロジェクトフォルダー内のフォルダーにzipを解凍しました。
- プロジェクトに gsl ヘッダーを含めました。
ここで何か不足していますか?
c++ - Ensures() - ガイドライン支援ライブラリ
コードでの使用方法を理解しようとしてEnsures()
います。例にあるように、次のように使用してみるとEnsures()
...
result
変数が と等しくない場合、255
プログラムは次の出力でクラッシュします"terminate called without an active exception"
。私の質問は、Ensures()
適切に使用する方法ですか?