我正在研究一本关于模式编程的书,C++遇到了一段在我脑海中提出的问题,我无法在任何地方找到明确的答案。
该段落涉及模板参数中的默认参数:
В принципе можно иметь аргументы по умолчанию для ведущих параметров шаблона
функции, даже если за ними следуют параметры без аргументов по умолчанию:
template<typename RT = long, typename Tl, typename T2>
RT max(T1 a, T2 b)
{
return b < a ? a : b;
}
我一直认为默认参数应该放在参数列表的末尾。这是合乎逻辑的,因为如果他们最后不去,就会出现不确定性。
我的问题如下:
- 为什么这条规则有例外?
- 这仅允许用于模板吗?
这些规则有些不同。这里
T1和T2是从传递的参数派生的。例如:很明显
T1=int,T2=char, 而不是指示的类型L- 是long。但是如果你写
然后我们指出
RT-double。和这里其他类型是明确指定的(而不是推论的)。
还有一点就是在指定类型参数的时候一定要依次指定,包括默认参数。例如,
和挑战
意味着你有
RT-double,T1-int,不是T1-double,T2-int,但是RT-long,所以这里没有歧义......并且在你明确指定所有三种类型之前,代码不会编译。在普通函数的情况下,没有默认值的参数不能省略,而在模板中可以推断出来。
这仅允许用于函数模板(而不是类)。
这是可能的,因为在函数调用时,可以从函数参数的类型推断出 T1 和 T2 的类型。那些。作为伪代码:
在偏特化的情况下,这样的伪代码是无法编写的,但保留了基于函数参数访问类型信息的原则。