Коли ми хочемо використовувати a static_assert
в a, if constexpr
ми повинні зробити умову залежною від певного параметра шаблону. Цікаво, що gcc та clang не погоджуються, коли код загорнутий у лямбда.
Наступний код компілюється з gcc, але clang викликає ствердження, навіть якщо це if constexpr
не може бути правдою.
#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>();
}
Це можна легко виправити, замінивши False<T>
на False<decltype(x)>
.
Тож питання: який компілятор правильний? Я б припустив, що gcc є правильним, тому що від умови static_assert
залежить від T
, але я не впевнений.
static_assert(False<int>, "AAA");
еквівалентна static_assert(false, "AAA");
всередині лямбда.
f(std::integral_constant<int, 1>{});
Wandbox, не викликає твердження: wandbox.org/permlink/UFYAmYwtt1ptsndr