'if constexpr branch'不会在模板函数内部的lambda内部被丢弃

时间:2019-04-29 18:34:09

标签: c++ c++17 if-constexpr

以下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对吗?

1 个答案:

答案 0 :(得分:17)

[stmt.if]/2

  

在封装模板化实体的实例化过程中,如果条件在实例化后不依赖于值,则不会实例化丢弃的子语句(如果有)。

由于makeFalse<T, decltype(type)>()值依赖的,因此看来foo<int>应该根据标准实例化,并且自{{1 }} T::x()T::x时格式错误,Clang正确地不对其进行编译。