Cuando queremos usar a static_assert
en a if constexpr
debemos hacer que la condición dependa de algún parámetro de plantilla. Curiosamente, gcc y clang no están de acuerdo cuando el código está envuelto en una lambda.
El siguiente código se compila con gcc, pero clang activa la afirmación, incluso si if constexpr
no puede ser cierto.
#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>();
}
Se puede arreglar fácilmente sustituyendo False<T>
por False<decltype(x)>
.
Entonces la pregunta es: ¿qué compilador es el correcto? Supongo que gcc es correcto porque la condición en el static_assert
depende T
, pero no estoy seguro.
static_assert(False<int>, "AAA");
es equivalente al static_assert(false, "AAA");
interior de la lambda.
f(std::integral_constant<int, 1>{});
Wandbox no activa la afirmación