C++11 返回类型后置

一、返回类型后置


返回类型后置是什么

第一次看着有点懵

来点熟悉的

int Fun(int a, int b);

上面这样这个 Fun 是一个返回值为 int 类型的函数

int 是在 Fun 前面

那么 返回类型后置 是不是 把 int 放在后面就可以了呢

答案是可以这么理解

C++11 推出了性特性 返回类型后置

举个栗子,返回类型后置 形如这样的

auto Fun(int a, int b) ->int
{
    return a + b;
}

auto 就作为一个占位符的意思,没其他意义

二、返回类型后置用来干嘛


1、个人觉得可能更直观一下吧

比如以下代码,感觉方式2直观些

// 方式1
typedef int(*arr)[2];
arr Fun1()
{
    return 0;
}

// 方式2
auto Fun2()->int(*)[2]
{
    return 0;
}

测试代码

#include 
#include 

using namespace std;

// 方式1
typedef int(*arr)[2];
arr Fun1()
{
	return 0;
}

// 方式2
auto Fun2()->int(*)[2]
{
	return 0;
}

// 主函数
int main(int argc, char* argv[])
{
	cout << typeid(decltype(Fun1)).name() << endl;
	cout << typeid(decltype(Fun2)).name() << endl;
	
	return 0;
}

 

2、只要用在模板方面

看一下以下代码

主要是通过给定数组下标然后返回数组的值

#include 
#include 

using namespace std;

template
T Fun(T* buf, int index)
{
	return buf[index];
}

// 主函数
int main(int argc, char* argv[])
{
	int arr[] = { 1,2,3,4,5,6 };
	cout << Fun(arr, 2) << endl;

	return 0;
}

基本类型是可以了,那我们试试 vector 

修改一下 Fun 代码

C++11 返回类型后置_第1张图片

 我们要返回解引用,但是解引用是表达式,是一种操作,而不是类型

所以这时候我们可以使用后置类型

template
auto Fun(T buf, int index)->decltype(*buf)
{
    return *(buf + index);
}

以看到没有报错 

 测试例子

#include 
#include 
#include 

using namespace std;

template
auto Fun(T buf, int index)->decltype(*buf)
{
	return *(buf + index);
}

// 主函数
int main(int argc, char* argv[])
{
	vector vec = { 1,2,3,4,5 };

	cout << Fun(vec.begin(), 2) << endl;

	return 0;
}

还有一种情况

看下列代码

#include 
#include 
#include 

using namespace std;

template
? Fun(A a, B b)
{
	return a + b;
}

// 主函数
int main(int argc, char* argv[])
{
	int a = 1;
	string b = 2;
	auto c = Fun(a, b);

	return 0;
}

 这个时候 Fun 的返回类型你就不知道写什么了

但是编译器是知道 Fun 的返回类型的

只是你不知道

所以这时候就用到了 返回类型后置

修改下代码

C++11 返回类型后置_第2张图片

 完美解决

三、_End


主要解决了模板中函数返回值类型不确定的问题!

主要解决了模板中函数返回值类型不确定的问题!

主要解决了模板中函数返回值类型不确定的问题!

你可能感兴趣的:(C++11,c++,开发语言,后端)