เมื่อเราต้องการที่จะใช้static_assert
ในif constexpr
เราจะต้องทำให้เงื่อนไขขึ้นอยู่กับพารามิเตอร์แม่แบบบางอย่าง น่าสนใจ gcc และเสียงดังกราวไม่เห็นด้วยเมื่อโค้ดถูกห่อในแลมบ์ดา
โค้ดต่อไปนี้คอมไพล์ด้วย gcc แต่เสียงดังกราวกระตุ้นการยืนยันแม้ว่า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