gpt4 book ai didi

c++ - 当它是具有默认参数的类模板时,模板参数推导如何对函数模板参数执行

转载 作者:行者123 更新时间:2023-12-01 14:08:04 24 4
gpt4 key购买 nike

template<typename T, typename U = T>
struct Test{};

template<typename T>
void func(Test<T>){ //#1
}

int main(){
func(Test<int>{}); //#2
}

考虑上面的代码,在函数模板的调用点 func , 参数类型是 Test<int,int> , 调用函数模板时,会执行模板参数推导。

函数调用的模板实参推导规则是:
temp.deduct#call-1

Template argument deduction is done by comparing each function template parameter type (call it P) that contains template-parameters that participate in template argument deduction with the type of the corresponding argument of the call (call it A) as described below.

我很确定 A 的类型是Test<int,int> , 但是我不确定 P 的类型是什么这是。是Test<T>Test<T,T> ,按照规则,好像是P的类型这是 Test<T> ,然后执行推导过程以确定T的值参与模板参数推导。然后根据这些规则描述如下:

temp.deduct#call-4

In general, the deduction process attempts to find template argument values that will make the deduced A identical to A (after the type A is transformed as described above).

temp.deduct#5

When all template arguments have been deduced or obtained from default template arguments, all uses of template parameters in the template parameter list of the template and the function type are replaced with the corresponding deduced or default argument values.

因为类模板Test有一个默认参数,因此推导出T被替换为默认参数。这意味着推导出ATest<int,int>并且它与参数类型 Test<int,int> 相同.

不过,这只是我的理解。我不确定 P 是什么类型这是。如果将函数参数的类型更改为 Test<int,double> , outcome将报告:

candidate template ignored: deduced conflicting types for parameter 'T' ('int' vs. 'double')

结果看起来好像 PTest<T,T>和拳 header value TT 的第二个值冲突.

所以,我的问题是:

是否P这是 Test<T>Test<T,T> ?为什么?

最佳答案

不是语言律师的回答

没有类型 Test<T>实际上是 Test<T, T> 的“速记” .

如果你有 int foo(int a, int b = 24) 就像使用默认函数参数一样函数的类型是 int (int, int)和任何像foo(11)这样的电话实际上是 foo(11, 24) .

关于c++ - 当它是具有默认参数的类模板时,模板参数推导如何对函数模板参数执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62876638/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com