Следующий код:
#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. Я не вижу ничего плохого в этом коде, но я не уверен. Прав ли Кланг, не собирая его?