Biz kullanmak istediğinizde static_assert
bir de if constexpr
bazı ş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 constexpr
doğ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_assert
bağ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