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が、よくわかりません。
static_assert(False<int>, "AAA");と同等static_assert(false, "AAA");です。
f(std::integral_constant<int, 1>{});Wandbox であるOPの例を使用しても、アサートはトリガーされません:wandbox.org/permlink/UFYAmYwtt1ptsndr