問題タブ [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++ - static_assert を使用して診断を改善する
テンプレート プログラミングでstatic_assert
は、プログラマがテンプレート引数の制約をチェックし、制約違反時に人間が読めるエラー メッセージを生成するのに役立ちます。
このコードを考えてみましょう。
私の考えは、最初のエラーが発生した場合、いくつかの要件が満たされていないstatic_assert
ことを意味するため、コンパイルを停止して、最初のエラー メッセージのみを生成する必要があるということです。エラー メッセージのほとんどは、単一の制約違反を示しています。たった 1 つではなく、何百ものエラー メッセージが画面上で非常に恐ろしく見えます。T
static_assert
たとえば、上記の関数テンプレートを次のように呼び出すとします。
GCC 4.8 は以下を生成します。
ご覧のとおり (オンライン)、これはエラーが多すぎます。最初のコードが失敗した場合、コンパイルを続行すると残りのコードも失敗するstatic_assert
可能性が非常に高いのに、なぜコンパイルを続行するのでしょうか? テンプレート プログラミングでは、多くのプログラマーがこのようなカスケード エラー メッセージを望んでいないと確信しています。
次のように、関数を複数の関数に分割し、それぞれが1つの制約のみをチェックすることで、この問題を解決しようとしました。
これにより、次が生成されます。
これは大幅な改善です。1 つのエラー メッセージだけで、読みやすく、理解しやすくなっています (オンラインを参照)。
私の質問は、
- コンパイルが最初に停止しないのはなぜ
static_assert
ですか? - 関数テンプレートを分割し、各 function_impl で 1 つの制約をチェックすると、 GCCのみが役立ち、clangは依然として 多くのエラーを生成するため、より一貫した方法で診断を改善する方法はありますか? すべてのコンパイラで機能するものはありますか?
c++ - 同一の static_assert メッセージについては、MACROS に依存する必要がありますか?
static_assertには次の構文があり、文字列リテラルが必要であることを示しています。
static_assert ( bool_constexpr 、文字列リテラル);
文字列のインスタンスはコンパイル時に観察できないため、次のコードは無効です。
コード全体に静的アサートがあり、同じエラー メッセージが表示されます。文字列リテラルが必要なので、すべての繰り返し文字列リテラルを MACRO に置き換えるのが最善でしょうか、それとももっと良い方法がありますか?
c++ - MSVC12 は、std::array から派生した集計はポッドではないと考えています
以下を考えると
次のコンパイラは、それlitmus
が podであることに同意します。
- clang++ バージョン 3.5 (トランク 198621) http://coliru.stacked-crooked.com/a/7add7a2fe58a7e38
- g++ 4.8.1 http://coliru.stacked-crooked.com/a/74cfe97f06c8c128
ただし、MSVC12 (VS2013 RTM) は、2 番目のアサートが失敗することを維持します。
- 誰が正しいですか?
- MSVC にクラスをポッドとして扱わせるためのトリックはありますか?
EDIT参考までに:
is_trivially_copyable<litmus>
MSVC で true-ness を返します。これは、実際の POD らしさが厳密に必要とされない多くの場合に役立ちます。
c++ - Q_OBJECT マクロを static_assert でチェックする
Q_OBJECT
与えられた型の宣言にマクロが含まれていない場合、コンパイル エラーを表示する必要があります。私はそれを行うための1つの悪い方法を見つけました。実際には、Qt 開発者が同じトリックを行うというアイデアを繰り返しています。
これはうまく機能しますが、実際には奇妙なエラーメッセージが表示されます。読みやすいメッセージを表示したい。これを行う 1 つの方法は、static_assert
構築を使用することです。Q_OBJECT
しかし、静的に検証されたマクロの存在条件を実装する方法がわかりません。たぶん誰かが美しいハックを提案できますか? また、どんなアイデアでも大歓迎です。
c++ - assert および static assert 関数の使用
static_assert と assert の使用とそれらの違いを理解しようとしていますが、これに関するソース/説明はほとんどありません
ここにいくつかのコードがあります
冗長性に関するコメントをいただければ幸いです (「C++ の使い方」を学んでいるため)
コマンドで出力
私はさまざまな方法とその使用法を見つけようとしていますが、私が理解している限りでは、それは実行時チェックであり、if ステートメントの別の「タイプ」です。
誰かが用途を明確にし、それぞれが何をしているのか、そしてそれらの違いを説明できますか?