Ketika kita ingin menggunakan static_assert
dalam if constexpr
kita harus membuat kondisi tergantung pada beberapa parameter template. Menariknya, gcc dan dentang tidak setuju ketika kode tersebut dibungkus dengan lambda.
Kode berikut dikompilasi dengan gcc, tetapi dentang memicu pernyataan, bahkan jika itu if constexpr
tidak benar.
#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>();
}
Itu dapat dengan mudah diperbaiki dengan mengganti False<T>
dengan False<decltype(x)>
.
Jadi pertanyaannya adalah: kompiler mana yang benar? Saya berasumsi bahwa gcc benar karena kondisi di static_assert
tergantung pada T
, tetapi saya tidak yakin.
static_assert(False<int>, "AAA");
setara dengan static_assert(false, "AAA");
di dalam lambda.
f(std::integral_constant<int, 1>{});
Wandbox tidak memicu pernyataan: wandbox.org/permlink/UFYAmYwtt1ptsndr