27

以下代码

#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 是不是没有编译它?

4

1 回答 1

18

[stmt.if]/2

在封闭模板化实体的实例化期间,如果条件在其实例化后不依赖于值,则不实例化丢弃的子语句(如果有)。

由于在实例化之后makeFalse<T, decltype(type)>() 值相关的foo<int>,因此似乎T::x()应该按照标准实例化,并且由于T::xis 时格式Tint正确,因此 Clang 不编译它是正确的。

于 2019-04-29T19:12:09.327 回答