Trailing return types是C++11关于函数声明的语言特性之一,旨在解决模版编程遇到的语法相关的问题,先看一个简单例子,感受一下什么是trailing return types:

C++03:

int func(int i, int j);

C++11可以写成:

auto func(int i, int j) -> int;

最直观感受就是,函数返回类型声明后置.

新的声明方式配合模版,可以使编译器自动推导模版函数的返回类型,使模版函数更泛化,例如:

C++03:

template<typename C1, typename C2, typename Ret>

Ret func(C1 i, C2 j){ return i + j;}

当你这样调用func(1, 2.0);编译器会告诉你,无法推导模版参数Ret.

调用函数时必须指定模版参数func<int, double, double>(1, 2.0);

这种声明方式即使在C++11,也无法配合decltype来推导,例如:decltype(i + j) func(C1 i, C2 j);因为decltype时,i j都还没有声明,为了解决这个问题,C++11引入了Trailing return types,看看怎么解决:

C++11:

template<typename C1 , typename C2 >
auto func(C1 i, C2 j)->decltype(i + j){ return i + j; }

把函数返回类型声明后置与函数形参声明,就可以启动decltype了。

明显地,使用Trailing return types的模版函数更泛用,因为函数所有的类型都能通过编译器自动推导,无需在源代码中显式指定。

Trailing return types另一个好处就是增强代码可读性:

C++03:

template <class T> class tmp

{

public:

int i;

};

tmp<int> (*(*foo())())()

{

return 0;

}

知道foo的返回类型是什么吗?再看

C++11:

template <class T> class tmp

{

public:

int i;

};

auto foo()->auto(*)()->tmp<int>(*)()

{

return 0;

}

这样应该清晰了吧,foo返回的是一个函数指针,这个函数指针的返回类型是tmp<int>(*)()函数指针.

参考

https://www.ibm.com/developerworks/community/blogs/5894415f-be62-4bc0-81c5-3956e82276f3/entry/introduction_to_the_c_11_feature_trailing_return_types?lang=en

Trailing return types的更多相关文章

  1. c++11: trailing return type in functions(函数返回类型后置)

    In C++03, the return type of a function template cannot be generalized if the return type relies on ...

  2. Async Return Types

    Async methods have three possible return types: Task<TResult>, Task, and void. The Task<TRe ...

  3. The return types for the following stored procedures could not be detected

    1.使用dbml映射数据库,添加存储过程到dbml文件时报错. 2.原因:存储过程中使用了临时表 3.解决方案 3.1 通过自定义表值变量实现 Ex: DECLARE @TempTable TABLE ...

  4. Google C++ Style Guide

    Background C++ is one of the main development languages used by many of Google's open-source project ...

  5. iOS:消除项目中警告

    引言: 在iOS开发过程中, 我们可能会碰到一些系统方法弃用, weak.循环引用.不能执行之类的警告. 有代码洁癖的孩子们很想消除他们, 今天就让我们来一次Fuck 警告!! 首先学会基本的语句: ...

  6. 【转】clang warning 警告清单(备查,建议直接command + F 速查 )

    Warning Message -WCFString-literal input conversion stopped due to an input byte that does not belon ...

  7. 使用#pragma阻止一些warnings

    这篇博客的内容都是记的网上的.是流水账.只是记录下来以便日后之有,避免每次重新google. #pragma除了可以用来把不同功能的代码进行分隔组织外还可以用来disable一些warnings.这在 ...

  8. C++11 能好怎?

    0. 摘要 近期读了一些关于C++11标准的材料. 本篇博客将从新标准的优点.与旧版本的区别和使用方法三个角度,大致介绍我对C++11的认识. C++11标准,原名C++0x, 是03版旧标准的更新. ...

  9. iOS -- warnings

    Semantic Warnings Warning Message -WCFString-literal input conversion stopped due to an input byte t ...

随机推荐

  1. Binding 中 Elementname,Source,RelativeSource 三种绑定的方式

    在WPF应用的开发过程中Binding是一个非常重要的部分. 在实际开发过程中Binding的不同种写法达到的效果相同但事实是存在很大区别的. 这里将实际中碰到过的问题做下汇总记录和理解. 1. so ...

  2. [Json] C#ConvertJson|List转成Json|对象|集合|DataSet|DataTable|DataReader转成Json (转载)

    点击下载 ConvertJson.rar 本类实现了 C#ConvertJson|List转成Json|对象|集合|DataSet|DataTable|DataReader转成Json|等功能大家先预 ...

  3. .NET3.5中的高性能 Socket API

    转载:http://www.cnblogs.com/TianFang/archive/2007/11/09/954730.html 在 .NET Framework 2.0 版本中,System.Ne ...

  4. 简单登录案例(SharedPreferences存储账户信息)&联网请求图片并下载到SD卡(文件外部存储)

    新人刚学习Android两周,写一个随笔算是对两周学习成果的巩固,不足之处欢迎各位建议和完善. 这次写的是一个简单登录案例,大概功能如下: 注册的账户信息用SharedPreferences存储: 登 ...

  5. Linux上安装KDE, Gnome和VNC

    安装所需环境:需要至少256m的可用内存(128也可以不过有点卡)CentOS或类似OS(Debian的话改成apt-get应该也可以) 1,安装KDE 1 yum install kdepim 或安 ...

  6. shiro认证

    一.通过ini文件初始化一个用户 1.通过ini配置文件创建securityManager2.调用subject.login方法主体提交认证,提交的token3.securityManager进行认证 ...

  7. PHP设计模式之:工厂模式

    工厂模式: 由工厂类根据参数来决定创建出哪一种产品类的实例: 工厂类是指包含了一个专门用来创建其他对象的方法的类.所谓按需分配,传入参数进行选择,返回具体的类.工厂模式的最主要作用就是对象创建的封装. ...

  8. Linux + C + Epoll实现高并发服务器(线程池 + 数据库连接池)(转)

    转自:http://blog.csdn.net/wuyuxing24/article/details/48758927 一, 背景 先说下我要实现的功能,server端一直在linux平台下面跑,当客 ...

  9. js实现中文简繁切换效果

    html代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www ...

  10. quick-x 计时器的写法

    local scheduler = require("framework.scheduler") --计时器 function MainScene:recoderTime() pr ...