Biz kullanmak istediğinizde static_assertbir de if constexprbazı şablon parametresine durum bağımlı yapmak zorundadır. İlginç bir şekilde, gcc ve clang, kod bir lambda içine sarıldığında katılmıyor.
Aşağıdaki kod gcc ile derlenir, ancak clang if constexprdoğru olamazsa bile iddiayı tetikler .
#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>();
}
Kolayca ikame ile tespit edilebilir False<T>ile False<decltype(x)>.
Soru şu: hangi derleyici doğru? Ben gcc doğru olduğunu varsayalım çünkü içinde koşul static_assertbağlıdır T, ama emin değilim.
static_assert(False<int>, "AAA");eşdeğerdir static_assert(false, "AAA");lambda iç.
f(std::integral_constant<int, 1>{});Sabitin Wandbox olduğu OP örneğini kullanmak iddiayı tetiklemez: wandbox.org/permlink/UFYAmYwtt1ptsndr