Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 显示实例化_C++_Templates_Explicit Specialization - Fatal编程技术网

C++ 显示实例化

C++ 显示实例化,c++,templates,explicit-specialization,C++,Templates,Explicit Specialization,这是由文章(第5页)引起的 模板 T常数和f(T常数和a、T常数和b){ 返回(a>b?a:b); } 模板int-const&f(int-const&,int-const&); int main(){ int x=0,y=0; 短s=0; f(x,y);//好的 f(x,s);//这个调用格式正确吗? } 调用'f(x,s)格式是否正确?我假设由于函数模板'f'是显式实例化的,将应用标准转换,因此'short s'将转换为'int',以匹配对显式专门化'f'的调用。但这似乎是不正确的 标准的

这是由文章(第5页)引起的

模板
T常数和f(T常数和a、T常数和b){
返回(a>b?a:b);
}
模板int-const&f(int-const&,int-const&);
int main(){
int x=0,y=0;
短s=0;
f(x,y);//好的
f(x,s);//这个调用格式正确吗?
}
调用
'f(x,s)
格式是否正确?我假设由于函数模板
'f'
是显式实例化的,将应用标准转换,因此
'short s'
将转换为
'int'
,以匹配对显式专门化
'f'
的调用。但这似乎是不正确的

标准的哪一部分谈到了在这种情况下的适用规则?

调用
f(x,s)
在语法上格式良好,但编译器将无法从中推断模板参数
T
,因为它可能是
int
short
(由于第一个和第二个参数)。实例化模板没有帮助,这只指示编译器编译该专门化并将其添加到生成的对象文件中

如果希望调用将
s
自动转换为
int
,请使用
f(x,s)

调用
f(x,s)
的语法结构良好,但编译器将无法从中推断模板参数
T
,因为它可能是
int
short
(因为第一个和第二个参数)。实例化模板没有帮助,这只指示编译器编译该专门化并将其添加到生成的对象文件中

如果希望调用将
s
自动转换为
int
,请使用
f(x,s)

否,调用
f(x,s)
格式不正确。由于没有明确说明要使用的专门化,编译器使用参数推断来尝试实例化函数模板;这会失败,因为
x
s
具有不同的类型,因此
T
不明确

适用规则见13.3.1中过载解决过程规范:

在每种情况下,如果候选函数是函数模板,则使用模板参数推断(14.8.3、14.8.2)生成候选函数模板专门化。然后,这些候选函数将按照通常的方式作为候选函数处理

14.8.3/1也适用于:

对于每个函数模板,如果参数推导和检查成功,则模板参数(推导和/或显式)用于实例化单个函数模板专用化,该专用化添加到要在重载解析中使用的候选函数集中。如果对于给定函数模板,参数推导失败,则不会将此类函数添加到该模板的候选函数集中

函数模板被显式地实例化为
T=int
,但编译器直到执行模板参数推断以确定
T
应该是什么之后才知道应该使用此实例化。

否,调用
f(x,s)
格式不正确。由于没有明确说明要使用的专门化,编译器使用参数推断来尝试实例化函数模板;这会失败,因为
x
s
具有不同的类型,因此
T
不明确

适用规则见13.3.1中过载解决过程规范:

在每种情况下,如果候选函数是函数模板,则使用模板参数推断(14.8.3、14.8.2)生成候选函数模板专门化。然后,这些候选函数将按照通常的方式作为候选函数处理

14.8.3/1也适用于:

对于每个函数模板,如果参数推导和检查成功,则模板参数(推导和/或显式)用于实例化单个函数模板专用化,该专用化添加到要在重载解析中使用的候选函数集中。如果对于给定函数模板,参数推导失败,则不会将此类函数添加到该模板的候选函数集中


函数模板是为
T=int
显式实例化的,但编译器在执行模板参数推断以确定
T
应该是什么之前,不知道应该使用此实例化。

显式实例化的专门化没有任何更高的优先级或优惠待遇。从实例化的角度来看,它只是整体存在。对库很有用

编译器根本无法确定要转换哪个参数,并且会像没有额外声明一样陷入困境

顺便说一句,如果您返回一个对已转换参数的引用,它将在临时过期后挂起。如果参数是对不同类型的引用,则无法正确形成返回值

这是我更新的
min

#include <type_traits>

template< typename A, typename B >
typename std::common_type< A, B >::type // cannot return ref
my_min( A const &a, B const &b ) {
    return a < b? a : b;
}

 // enable_if< is_same< A, B > > the old, return-by-reference impl

int main() {
    int q = my_min( short(5), long(3) );
}
#包括
模板
typename std::common_type::type//无法返回ref
my_min(A const&A,B const&B){
返回a>旧的,通过引用返回impl,则启用
int main(){
int q=我的最小值(短(5),长(3));
}

明确实例化的专门化没有任何更高的优先级或优惠待遇。它只是从实例化的角度整体存在。对库很有用

编译器根本无法确定要转换哪个参数,并且会像没有额外声明一样陷入困境

顺便说一句,如果您返回一个对已转换参数的引用,它将在临时过期后挂起。如果这些参数是对不同类型的引用,则无法恢复
#include <type_traits>

template< typename A, typename B >
typename std::common_type< A, B >::type // cannot return ref
my_min( A const &a, B const &b ) {
    return a < b? a : b;
}

 // enable_if< is_same< A, B > > the old, return-by-reference impl

int main() {
    int q = my_min( short(5), long(3) );
}