Когда мы хотим использовать a static_assert
в a, if constexpr
мы должны сделать условие зависимым от некоторого параметра шаблона. Интересно, что gcc и clang не согласны, когда код обернут в лямбду.
Следующий код компилируется с помощью gcc, но clang запускает утверждение, даже если значение if constexpr
не может быть истинным.
#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)>
.
Вопрос в том, какой компилятор прав? Я бы предположил, что gcc является правильным, потому что условие в static_assert
зависит от T
, но я не уверен.
static_assert(False<int>, "AAA");
эквивалентно static_assert(false, "AAA");
внутри лямбда.
f(std::integral_constant<int, 1>{});
Wandbox, не вызывает утверждения: wandbox.org/permlink/UFYAmYwtt1ptsndr