問題タブ [static-assert]
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++ - MSVC10でSFINAE、type traits、static_assertを使用することはできません
私はエラーメッセージを改善するためにいくつかの賢明な静的アサーションの使用を調査してきました。次に例を示します。
IDEONEは、私が取得したいと思っていた、すてきでクリーンなエラーメッセージでこのコードを喜んで拒否します(とにかく、nullptrを0に置き換えたら)。ただし、MSVCは静的アサーションを起動せず、このコードを正常にコンパイルします。メンバー関数をいくつか追加して呼び出しを開始した場合でも同様です。
c++ - 実際に使用されている場合にのみメンバーテンプレートで static_assert する方法は?
この単純なクラスを考えてみましょう:
テンプレート型からの暗黙的な構築と、単純なラッパーであるその型への暗黙的な変換を許可します。
今、関係のない s 間の変換を有効にしたくありませんFoo
。これは、これらの暗黙的な構築/変換のために可能になります。テンプレート化された copy-ctor を非公開にすることはできますが、static_assert
.
問題は、ここで Ideoneに示されているようstatic_assert
に、タイプをコピーしようとしても失敗することです! Visual Studio では、必要な動作が得られますが、これは VS がテンプレートを解析する方法によるものだと思います。これを機能させる方法はありますか?
c++ - タイプ名を static_assert 出力に組み込みますか?
私は役立つエラーやメッセージを提供するのが好きで、自分のためにもそうしたいと思っていますstatic_assert
。問題は、それらがテンプレート パラメーターに依存していることです。通常、これらのパラメーターはエラーが発生したために途中で表示されますが、それらはあいまいであるかグループ化されていないため、意味があります。例:
MSVC での出力:
1 つのタグは関数テンプレート自体に記載されており、もう 1 つのタグはクラス テンプレートの下に記載されています。あまり良くない。GCCが出力するものを見てみましょう:
はるかに優れていますが、まだ実際にはどこにあるかはわかりませんstatic_assert
。そして、いくつかのパラメータ、テンプレート、またはその両方を想像してみてください。震える
これを回避する 1 つの方法は、両方のタグをテンプレート パラメーターとして受け取る中間構造体を使用することです。
出力をもう一度見てみましょう。
ずっといい!GCCが言うことは次のとおりです。
見た目は悪くない。問題:エラーメッセージはstatic_assert
文字列リテラルである必要があるため、すべてのテンプレートに対してそのような構造体を作成する必要があります...
さて、私の質問ですが、どうにかして型名を に直接含めることはできますstatic_assert
か? お気に入り
出力例:
Foo<int,main::TagA>
から作成できませんFoo<int,main::TagB>
。
または、それが達成できない場合は、何とかしてエラー メッセージを追加のテンプレート パラメーターにして、問題ないようにすることはできますか?
visual-studio-2010 - 関数宣言の static_assert
を使用した非常に単純な関数がありますstatic_assert
。static_assert
問題は、関数宣言に関連する動作、特に戻り値の型を推測したいことです。コンパイラが戻り値の型の推定に失敗する前static_assert
に起動できるように、を挿入する場所がないようです。
ここまでは戻り値の型推定と静的アサーションを構造体に入れました。これにより、アサーションが起動されます。これは素晴らしいことですが、型推論でエラーが発生します。これは、私が除去したいノイズです。
c++ - static_assert が Visual C++ 10 で機能しない
Visual C++ 10 には組み込みstatic_assert
の. ただし、次をコンパイルすると
私は得る
エラー C3861: 'static_assert': 識別子が見つかりません
static_assert
Visual C++ 10 でどのように使用すればよいですか?
c++ - 構造体内の静的アサートは許可されていますか?
いくつかのテンプレート設定構造体がありますが、これらの構造体で静的アサートを使用しても大丈夫ですか?
ご回答ありがとうございます!
c++ - 型がベクトルかどうかを static_assert で確認できますか?
型がベクトルかどうかを static_assert で確認できますか? IE では、 a はint
アサーションを発生させますが、avector<int>
はそうしません。
私は次のようなことを考えています:
c++ - typedef ベースの静的アサートよりもテンプレート ベースの静的アサートを好むのはなぜですか?
組み込みの を持たないバージョンの C++ では、広く使用されている static assert の実装が 2 つありますstatic_assert
。
最初のものはBoostで使用され、テンプレートとそのテンプレートの特殊化を使用します:
ここで、チェックする条件が false になると、コンパイラはテンプレートの汎用バージョンを見つけることができず、コンパイルは失敗します。
2番目は次を使用しますtypedef
:
ここで、チェックする条件に違反すると、コンパイラtypedef
はサイズ -1 の配列を試みますが、これは違法であるため、コンパイル時エラーが発生します。
コードを発行しないことが保証されており、次のように使用できるため、後者の方が優れています(ここから):
前者はそのようには使用できません。
後者よりも静的アサートの前者の実装を好む理由はありますか?
c++11 - C++11: static_assert() の std::max(a,b)?
max
私は、最後の C++-Std Doc N3291 の [24.4.7] ではないことに気付きましたconstexpr
:
したがって、static_assert
たとえば、これを使用することは許可されていません。正しい?
c++ - C ++ 0x構造体がPODであるかどうかを判断するためのコンパイル時の関数/マクロはありますか?
特定の構造体タイプがPODであるかどうかをテストするC++0x static_assertが必要です(他のプログラマーが誤って新しいメンバーでそれを壊さないようにするため)。すなわち、
is_pod_type()
ここで使用できるマクロまたは組み込みの種類はありますか?C ++ 0xのドキュメントでは見つかりませんでしたが、もちろん、0xに関するWebの情報はまだ断片的です。