考虑一个简单的例子:
#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:
如果重载解析过程可以在不实例化类模板定义的情况下确定要调用的正确函数,则不确定该实例化是否真正发生。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句