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