Khi chúng ta muốn sử dụng một static_assert
trong if constexpr
chúng ta phải làm cho tình trạng phụ thuộc vào một số mẫu tham số. Thật thú vị, gcc và clang không đồng ý khi mã được bọc trong lambda.
Đoạn mã sau biên dịch với gcc, nhưng tiếng kêu kích hoạt xác nhận, ngay cả khi điều đó if constexpr
không đúng.
#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>();
}
Nó có thể dễ dàng được sửa chữa bằng cách thay thế False<T>
bằng False<decltype(x)>
.
Vậy câu hỏi là: trình biên dịch nào đúng? Tôi cho rằng gcc là chính xác vì điều kiện trong static_assert
phụ thuộc vào T
, nhưng tôi không chắc chắn.
static_assert(False<int>, "AAA");
tương đương với static_assert(false, "AAA");
bên trong lambda.
f(std::integral_constant<int, 1>{});
Wandbox không kích hoạt xác nhận: Wandbox.org/permlink/UFYAmYwtt1ptsndr