考虑一个简单的例子:
#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: