以下code:
#include <type_traits>
struct X {
static constexpr void x() {}
};
template <class T1, class T2>
constexpr bool makeFalse() { return false; }
template <class T>
void foo() {
T tmp;
auto f = [](auto type) {
if constexpr (makeFalse<T, decltype(type)>()) {
T::x(); // <- clang does not discard
} else {
// noop
}
};
}
int main() {
foo<int>();
}
不使用Clang进行编译,而是使用GCC进行编译。我看不到这段代码有什么问题,但是我不确定。 Clang对吗?
答案 0 :(得分:17)
在封装模板化实体的实例化过程中,如果条件在实例化后不依赖于值,则不会实例化丢弃的子语句(如果有)。
由于makeFalse<T, decltype(type)>()
的是值依赖的,因此看来foo<int>
应该根据标准实例化,并且自{{1 }} T::x()
为T::x
时格式错误,Clang正确地不对其进行编译。