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. BI任务列表

    了解点击流系统和pv/uv的相关计算 关于pv的那些事!! ···············································2014-09-10 homework做了些什 ...

  2. php字符串函数(1)

    下面去学习一下php的字符串函数,那么怎么去看手册呢,举个例子 int strcasecmp ( string $str1 , string $str2 ) 第一个int,表示此函数返回的类型是int ...

  3. WEB 开发工具分享

    有好用的工具 : 云盘链接地址:

  4. 学习java随笔第四篇:运算符

    算术运算符 "+":加法运算符,也可做字符连接用途 "-":减法运算符 "*":乘法运算符 "/":除法运算符 &quo ...

  5. Eclipse闪退/打不开/无法启动/一闪而过

    转自:http://my.oschina.net/psuyun/blog/421058 很长时间了,写java.写android都是用的Eclipse.可是突然有一天,当我像往常一样试图打开Eclip ...

  6. SET QUOTED_IDENTIFIER OFF语句的作用

    先看下面几个sql语句  1 SET QUOTED_IDENTIFIER ON 2 SELECT * FROM "USER"    WHERE a='netasp'  3  4 S ...

  7. play app to war

    project/Build.scala import sbt._ import Keys._ import play.Play.autoImport._ import PlayKeys._ impor ...

  8. 时间格式nls_date_format的设置

    nls_date_format参数用于设置日期显示格式,设置的方式有多种,不同的方式也会带来不同的结果.参数的设置是有优先级的,日期格式的参数设置也不例外.优先级如下(低到高):初始化参数 < ...

  9. Lucene 排序 Sort与SortField

    在sql语句中,有升序和降序排列.在Lucene中,同样也有. Sort里的属性 SortField里的属性 含义 Sort.INDEXORDER SortField.FIELD_DOC 按照索引的顺 ...

  10. 倒置字符串s中各字符的位置

    倒置字符串s中各字符的位置 其中reverse函数可以写成更紧凑的形式 void reverse(char s[]){ int c,i,j; ,j=strlen(s)-;i<j;i++,j--) ...