'if constexpr branch' 不会在模板函数内的 lambda 内被丢弃
An 'if constexpr branch' does not get discarded inside lambda that is inside a template function
以下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 不编译它是对的吗?
During the instantiation of an enclosing templated entity, if the condition is not value-dependent after its instantiation, the discarded substatement (if any) is not instantiated.
因为 makeFalse<T, decltype(type)>()
是 在实例化 foo<int>
之后依赖于值的,看来 T::x()
应该根据标准实例化,由于 T::x
在 T
为 int
时格式错误,Clang 不编译它是正确的。
以下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 不编译它是对的吗?
During the instantiation of an enclosing templated entity, if the condition is not value-dependent after its instantiation, the discarded substatement (if any) is not instantiated.
因为 makeFalse<T, decltype(type)>()
是 在实例化 foo<int>
之后依赖于值的,看来 T::x()
应该根据标准实例化,由于 T::x
在 T
为 int
时格式错误,Clang 不编译它是正确的。