Lorsque nous voulons utiliser un static_assert
dans un, if constexpr
nous devons rendre la condition dépendante d'un paramètre de modèle. Fait intéressant, gcc et clang ne sont pas d'accord lorsque le code est enveloppé dans un lambda.
Le code suivant se compile avec gcc, mais clang déclenche l'assertion, même si le if constexpr
ne peut pas être vrai.
#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>();
}
Il peut facilement être corrigé en remplaçant False<T>
par False<decltype(x)>
.
La question est donc: quel compilateur a raison? Je suppose que gcc est correct car la condition dans le static_assert
dépend de T
, mais je ne suis pas sûr.
static_assert(False<int>, "AAA");
équivaut à l' static_assert(false, "AAA");
intérieur du lambda.
f(std::integral_constant<int, 1>{});
Wandbox ne déclenche pas l' assertion