考虑一个简单的例子:

#include <type_traits>

template <class T, std::size_t N>
struct MaybeAssert {
    using type = T;
    static_assert(N < 1, "Assertion");
};

template <class T>
void foo(typename MaybeAssert<T, 0>::type) {
}

template <class T>
void foo(typename MaybeAssert<T, 0>::type,
         typename MaybeAssert<T, 1>::type) {
}

int main() {
   foo<int>(2);
}

[gcc]实例化MaybeAssert<T, 1>,在示例中将触发static_assert

另一方面,[clang]仅在功能模板参数的数量匹配时实例化类型。哪个编译器正确?

最佳答案

两者都是有效的[temp.inst]/7:

10-07 13:38