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);