即使重载函数的参数计数不匹配,编译器是否应该实例化所有参数相关类型

WF

考虑一个简单的例子:

#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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

是否有一个 gcc 编译器选项可以帮助捕获形式和实际参数类型不匹配?

编译器不解析默认类型化函数参数

编译器如何在不更改参数列表的情况下重载模板函数?

Google Closure编译器发出警告:类型不兼容;即使参数具有通用类型,有没有办法解决?

编译器没有发现构造函数初始化期间传递的实例变量和参数之间存在歧义?

Scala编译器抱怨方法级别上通用参数的类型不匹配

c++ 多个重载函数实例匹配参数类型

没有重载函数的实例与参数列表匹配

Kotlin编译器混合了化类型参数

是否有C ++编译器选项可允许主动删除所有函数调用并将参数传递给具有空主体的函数?

如何使编译器检查2个方法参数是否具有相同类型?

具有动态函数参数的C#编译器类型推断

C++ msvc 编译器没有类型检查函数参数是一个引用

“函数“实例化”没有重载需要 4 个参数”

带有元组参数的函数的编译器混乱

函数参数类型不匹配

通过参数计数推导重载成员函数的函数参数类型

模板实例化失败:编译器选择了不正确的重载函数

相同的声明和类型编译器错误。(xyz* 类型的 arg 与 xyz* 类型的参数不兼容)

用于检查所有模板参数类型是否唯一的编译时 C++ 函数

有关相同方法的参数类型冲突和转换不兼容的编译器错误

如何询问 Scala 是否存在所有类型参数实例化的证据?

类型不匹配且特征迭代器作为函数参数

用于重载数组参考参数的编译器差异

当构造函数从实现的接口接收不同的参数类型时,Typescript编译器没有错误

编译器:尽管给出了所有参数,但给出了太多参数

flowtype:如何按参数计数/类型重载函数返回类型?

当用不相关的接口类型调用时,为什么编译器选择带有类类型参数的通用方法?

函数声明和定义的返回类型不匹配,尽管编译器还可以吗?