問題タブ [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.

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

c++ - static_assert を使用して診断を改善する

テンプレート プログラミングでstatic_assertは、プログラマがテンプレート引数の制約をチェックし、制約違反時に人間が読めるエラー メッセージを生成するのに役立ちます。

このコードを考えてみましょう。

私の考えは、最初のエラーが発生した場合、いくつかの要件が満たされていないstatic_assertことを意味するため、コンパイルを停止して、最初のエラー メッセージのみを生成する必要があるということです。エラー メッセージのほとんどは単一制約違反を示しています。たった 1 つではなく、何百ものエラー メッセージが画面上で非常に恐ろしく見えますTstatic_assert

たとえば、上記の関数テンプレートを次のように呼び出すとします。

GCC 4.8 は以下を生成します。

ご覧のとおり (オンライン)、これはエラーが多すぎます。最初のコードが失敗した場合、コンパイルを続行すると残りのコードも失敗するstatic_assert可能性が非常に高いのに、なぜコンパイルを続行するのでしょうか? テンプレート プログラミングでは、多くのプログラマーがこのようなカスケード エラー メッセージを望んでいないと確信しています。

次のように、関数を複数の関数に分割し、それぞれが1つの制約のみをチェックすることで、この問題を解決しようとしました。

これにより、次が生成されます。

これは大幅な改善です。1 つのエラー メッセージだけで、読みやすく、理解しやすくなっています (オンラインを参照)。

私の質問は、

  • コンパイルが最初に停止しないのはなぜstatic_assertですか?
  • 関数テンプレートを分割し、各 function_impl で 1 つの制約をチェックすると、 GCCのみが役立ち、clangは依然として 多くのエラーを生成するため、より一貫した方法で診断を改善する方法はありますか? すべてのコンパイラで機能するものはありますか?
0 投票する
1 に答える
305 参照

c++ - 同一の static_assert メッセージについては、MACROS に依存する必要がありますか?

static_assertには次の構文があり、文字列リテラルが必要であることを示しています。

static_assert ( bool_constexpr 、文字列リテラル);


文字列のインスタンスはコンパイル時に観察できないため、次のコードは無効です。


コード全体に静的アサートがあり、同じエラー メッセージが表示されます。文字列リテラルが必要なので、すべての繰り返し文字列リテラルを MACRO に置き換えるのが最善でしょうか、それとももっと良い方法がありますか?

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

c++ - MSVC12 は、std::array から派生した集計はポッドではないと考えています

以下を考えると

次のコンパイラは、それlitmusが podであることに同意します。

ただし、MSVC12 (VS2013 RTM) は、2 番目のアサートが失敗することを維持します。

  1. 誰が正しいですか?
  2. MSVC にクラスをポッドとして扱わせるためのトリックはありますか?

EDIT参考までに: is_trivially_copyable<litmus>MSVC で true-ness を返します。これは、実際の POD らしさが厳密に必要とされない多くの場合に役立ちます。

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

c++ - Q_OBJECT マクロを static_assert でチェックする

Q_OBJECT与えられた型の宣言にマクロが含まれていない場合、コンパイル エラーを表示する必要があります。私はそれを行うための1つの悪い方法を見つけました。実際には、Qt 開発者が同じトリックを行うというアイデアを繰り返しています。

これはうまく機能しますが、実際には奇妙なエラーメッセージが表示されます。読みやすいメッセージを表示したい。これを行う 1 つの方法は、static_assert構築を使用することです。Q_OBJECTしかし、静的に検証されたマクロの存在条件を実装する方法がわかりません。たぶん誰かが美しいハックを提案できますか? また、どんなアイデアでも大歓迎です。

0 投票する
4 に答える
2176 参照

c++ - assert および static assert 関数の使用

static_assert と assert の使用とそれらの違いを理解しようとしていますが、これに関するソース/説明はほとんどありません

ここにいくつかのコードがあります

冗長性に関するコメントをいただければ幸いです (「C++ の使い方」を学んでいるため)

コマンドで出力

私はさまざまな方法とその使用法を見つけようとしていますが、私が理解している限りでは、それは実行時チェックであり、if ステートメントの別の「タイプ」です。

誰かが用途を明確にし、それぞれが何をしているのか、そしてそれらの違いを説明できますか?