模板函数的默认类型假设

Default type assumption by a template function

本文关键字:类型 假设 默认 函数      更新时间:2023-10-16

示例:假设f是一个模板函数,有两个参数:

f (1, 2)在这个调用中,模板函数是否假设它的参数是int,或short,或其他任何东西?

编辑1:

模板函数声明:

template <typename dataTypeA, typename dataTypeB> dataTypeB functionX (dataTypeA argA, dataTypeB argB)

模板没有假设任何东西。字面值的类型为int,这将是编译器推断的类型。

正如@David已经说过的,就你的问题而言,没有"做出假设"这样的事情。字面量只是具有类型,这些类型是函数模板可以用于类型推断的类型。不过请记住,转换是模板匹配的一部分!

那么,假设你有这个函数模板:

template <typename T> void foo(T x, T y);

如果你调用foo(1, 2),它将被T = int调用。

如果输入foo(1u, 2u),则推导结果为T = unsigned int

如果你说任何像foo(1u, 2)这样的混合,没有首选匹配,编译器会报告错误。

由于C或c++中没有short字面量,如果你想显式地调用foo<short>函数,你可以这样说,或者创建临时的显式short参数:

foo<short int>(3, 4);
foo<short int>(3u, 4l);  // also OK because of conversion
foo(short(3), short(4)); // deduction

更新:根据您的编辑,请注意,由于您只匹配每个模板形参的一个参数,因此您不会遇到歧义匹配的问题。