static_assert
에서 를 사용하려면 if constexpr
일부 템플릿 매개 변수에 따라 조건을 만들어야합니다. 흥미롭게도 코드가 람다로 싸여 있으면 gcc와 clang이 동의하지 않습니다.
다음 코드는 gcc로 컴파일되지만 clang은 if constexpr
true 일 수 없더라도 assert를 트리거 합니다.
#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)>
.
문제는 어떤 컴파일러가 옳습니까? 의 조건 static_assert
이에 의존 하기 때문에 gcc가 정확하다고 가정 T
하지만 확실하지 않습니다.
static_assert(False<int>, "AAA");
와 같습니다 static_assert(false, "AAA");
.
f(std::integral_constant<int, 1>{});
Wandbox 인 OP의 예를 사용하면 어설트가 트리거되지 않습니다. wandbox.org/permlink/UFYAmYwtt1ptsndr