'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 不编译它是对的吗?

[stmt.if]/2:

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::xTint 时格式错误,Clang 不编译它是正确的。