タグ付けされた質問 「static-assert」



2
ラムダでstatic_assertを指定したconstexprの場合、どのコンパイラが正しいですか?
static_assertでa if constexprを使用する場合は、条件をいくつかのテンプレートパラメータに依存させる必要があります。興味深いことに、コードがラムダでラップされている場合、gccとclangは一致しません。 次のコードはgccでコンパイルされますが、clang if constexprがtrueでなくても、clangはアサートをトリガーします。 #include <utility> template<typename T> constexpr std::false_type False; template<typename T> void foo() { auto f = [](auto x) { constexpr int val = decltype(x)::value; if constexpr(val < 0) { static_assert(False<T>, "AAA"); } }; f(std::integral_constant<int, 1>{}); } int main() { foo<int>(); } ここでライブ例。 それは簡単に置き換えることによって固定することが可能False<T>でFalse<decltype(x)>。 だから問題は:どのコンパイラーが正しいのか?の状態static_assertはに依存しているので、gccは正しいと思いますTが、よくわかりません。

5
assert()とstatic_assert()の間でディスパッチする方法、constexprコンテキストに依存するか?
C ++ 11 constexpr関数では、anなどの2番目のステートメントassert()は使用できません。A static_assert()は問題ありませんが、関数が「通常の」関数として呼び出された場合は機能しません。カンマ演算子はwrtoを助けるために来るかもしれません。assert()しかし、醜いですし、いくつかのツールは、それについての警告を吐きます。 アサーションのほかに完全に制約可能な「ゲッター」を検討してください。しかし、実行時とコンパイル時に何らかのアサーションを保持したいのですが、 'constexpr'コンテキストによってはオーバーロードすることはできません。 template<int Size> struct Array { int m_vals[Size]; constexpr const int& getElement( int idx ) const { ASSERT( idx < Size ); // a no-go for constexpr funcs in c++11 // not possible, even in constexpr calls as being pointed out, but what I …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.