C++ 这是模板的正确行为吗? 模板 blah func(bleh p) { //做点什么 } int main() { 双d=1.111; int i=func(d);/#1 int j=func(d);/#2 // .... }
在本例中,C++ 这是模板的正确行为吗? 模板 blah func(bleh p) { //做点什么 } int main() { 双d=1.111; int i=func(d);/#1 int j=func(d);/#2 // .... },c++,templates,C++,Templates,在本例中,func、#1和#2的实例都在编译,但我不确定什么是正确的,以及为什么 有人能解释一下为什么#1是正确的,也许能提供一些背景吗?是的,这是正确的行为 案例1-类型扣除 bleh的类型被显式设置为double,因此编译器将其设置为double。提供了参数d,并且由于它也是一个double,编译器很高兴地继续。如果参数(即代替d)提供的类型不是double,或者无法隐式转换为double(例如,通过促销、非显式构造函数或用户提供的转换),这将导致错误。\1使用类型推断。因此编译器将d视为一
func
、#1和#2的实例都在编译,但我不确定什么是正确的,以及为什么
有人能解释一下为什么#1是正确的,也许能提供一些背景吗?是的,这是正确的行为
案例1-类型扣除
bleh
的类型被显式设置为double
,因此编译器将其设置为double。提供了参数d
,并且由于它也是一个double
,编译器很高兴地继续。如果参数(即代替d
)提供的类型不是double
,或者无法隐式转换为double
(例如,通过促销、非显式构造函数或用户提供的转换),这将导致错误。\1使用类型推断。因此编译器将d
视为一个双精度,并推断bleh
应该是一个双精度。#1使用给定参数的类型推断。Niall和πάντα添加了您需要知道的所有内容。这是两种方法之间的主要区别。这意味着intj=func(d)
也可以,但是由于在这个调用中p
是int
,您可能会得到不同的结果。
template<class blah, class bleh>
blah func(bleh p)
{
// Do something
}
int main()
{
double d=1.111;
int i = func<int>(d); // #1
int j = func<int,double>(d); // #2
// ....
}
func<int>(d);
func<int,double>(d);