[英]C++ Template method unknown return type
我遇到了一段我不遵循的代码。 考虑以下两种方法。
template <typename T>
auto FindElementV1(std::vector<T> elementList, const T& element) {
return std::find(elementList.begin(), elementList.end(), element);
}
template <typename T>
auto FindElementV2(std::vector<T> elementList, const T& element) -> typename decltype(elementList)::iterator {
return std::find(elementList.begin(), elementList.end(), element);
}
我可以理解,使用decltype
指定该方法的返回类型时, FindElementV2
起作用。 但是,为什么FindElementV1
在未指定返回类型的情况FindElementV1
工作? V1
是符合标准的代码吗?
以下是完整的工作示例。 符合gcc 6.3
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
template <typename T>
auto FindElementV1(std::vector<T> elementList, const T& element) {
return std::find(elementList.begin(), elementList.end(), element);
}
int main() {
std::vector<int> vec = {1,4,2,4,3,5,3,5,3,6};
auto it = FindElementV1(vec, 5); //< Why does this work without a return type in the method?
cout<<*it<<endl;
}
[dcl.spec.auto]
如果函数的声明的返回类型包含占位符类型, 则从函数体内未丢弃的返回语句(如果有)中推导出函数的返回类型
并且
如果具有包含占位符类型的已声明返回类型的函数具有多个未丢弃的返回语句,则为每个此类返回语句推导返回类型。 如果推导的类型在每次推导中都不相同,则程序格式错误。
丢弃的语句是出现在constexpr if语句[stmt.if]的未采用分支中的语句。
C ++ 14使我们能够用推导的返回类型编写函数:
auto foo() { return 5; }
在C ++ 11中,这是格式错误的-您需要以某种方式指定返回类型。 在C ++ 14中,我们可以从return
语句保守地推断出返回类型。 保守地说,我的意思是如果有多个-它们都必须是同一类型,并且如果递归,则需要递归第二个而不是第一个。
推导遵循正常的模板推导规则。 所以这:
auto foo(int& i) { return i; }
返回一个int
,而不是int&
。
所有这些都是说,是的,从C ++ 14开始, FindElementV1
是一个完全有效的函数模板...。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.