Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/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++_C++11_Templates_C++14_Template Meta Programming - Fatal编程技术网

C++ 模板类型推断是否可以考虑基元操作类型转换?

C++ 模板类型推断是否可以考虑基元操作类型转换?,c++,c++11,templates,c++14,template-meta-programming,C++,C++11,Templates,C++14,Template Meta Programming,模板似乎无法推断原始操作的结果。例如,以下公式无法推断R: template<typename A, typename B, typename R> R addNumbers(A x, B y){ return x + y; } main(){ addNumbers(1.0f, 1); } 模板 R地址编号(A x,B y){ 返回x+y; } main(){ 地址编号(1.0f,1); } 尽管很明显,float+int=float P>是否在C++的任何版本

模板似乎无法推断原始操作的结果。例如,以下公式无法推断R:

template<typename A, typename B, typename R>
R addNumbers(A x, B y){
    return x + y;
}
main(){
    addNumbers(1.0f, 1);
}
模板
R地址编号(A x,B y){
返回x+y;
}
main(){
地址编号(1.0f,1);
}
尽管很明显,
float+int=float


<> P>是否在C++的任何版本中得到某种方式来推断该信息,而不显式指定它?< /P> < P>模板参数推导:调用函数时不能查看函数的主体;它只是试图使函数的参数类型与参数类型相同,并且任何不能以这种方式推导的模板参数都保持不变。您需要一种基于函数体中返回语句的推导形式。这是由C++14中的
auto
提供的:

template<typename A, typename B>
auto addNumbers(A x, B y){
    return x + y;
}
模板
自动添加编号(A x,B y){
返回x+y;
}

函数重载扣除,无论是否考虑模板,都不会也不能考虑返回类型。返回类型不是函数签名的一部分。演绎只考虑调用的参数是否与各种函数声明的参数匹配。以下内容将匹配任何A和B。如果定义了
operator+(A,B)
,则返回类型将是它返回的任何类型。如果未定义
运算符+(A,B)
,编译器将抛出错误

template<typename A, typename B>
auto addNumbers(A x, B y){
    return x + y;
}
int main(){
    addNumbers(1.0f, 1);
}
模板
自动添加编号(A x,B y){
返回x+y;
}
int main(){
地址编号(1.0f,1);
}

decltype
是C++11中最好的添加之一。 了解更多信息:

基于C++11的解决方案(使用编译器标志
-std=C++11

用法:

auto ans = addNumbers(1.0f, 1); // ans is deduced to be float

或者,如果您想使其非常具体(但不更具可读性),您可以使用
decltype(x+y)
作为返回类型。这是在编译时执行的推断吗?@oink yes it Is Is fall这不会对1小时前发布的答案添加任何内容
template<typename A, typename B>
auto addNumbers(A const & x, B const & y)
{
    return x + y;
}
auto ans = addNumbers(1.0f, 1); // ans is deduced to be float