当我们要在中使用时static_assert
,if constexpr
必须使条件取决于某些模板参数。有趣的是,当代码包装在lambda中时,gcc和clang不同意。
以下代码使用gcc进行编译,但是clang触发断言,即使if constexpr
不能为true。
#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");
lambda内部。
f(std::integral_constant<int, 1>{});
Wandbox 的示例不会触发断言:wandbox.org/permlink/UFYAmYwtt1ptsndr