Lorsque nous voulons utiliser un static_assertdans un, if constexprnous 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 constexprne 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_assertdé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