C++11 FAQ中文版:返回值类型后置语法
来源:互联网 发布:电脑硬件修改软件 编辑:程序博客网 时间:2024/06/03 17:21
返回类型后置语法
考虑下面这段代码:
template<class T, class U>??? mul(T x, U y){ return x*y;}
函数mul()的返回类型要怎么写呢?当然,是“x*y类型”,但是这并不是一个数据类型,我们如何才能一开始就得到它的真实数据类型呢?在初步了解C++0x之后,你可能一开始想到使用decltype来推断“x*y”的数据类型:
template<class T, class U>decltype(x*y) mul(T x, U y) // 注意这里的作用域{ return x*y;}
但是,这种方式是行不通的,因为x和y不在作用域内。但是,我们可以这样写:
template<class T, class U>// 难看别扭,且容易产生错误decltype(*(T*)(0)**(U*)(0)) mul(T x, U y){ return x*y;}
如果称这种用法为“还可以”,就已经是过誉了。
C++11的解决办法是将返回类型放在它所属的函数名的后面:
template<class T, class U>auto mul(T x, U y) -> decltype(x*y){ return x*y;}
这里我们使用了auto关键字,(auto在C++11中还有根据初始值推断数据类型的意义),在这里它的意思变为“返回类型将会稍后引出或指定”。
返回值后置语法最初并不是用于模板和返回值类型缩减的,它实际是用于解决作用域问题的。
struct List {struct Link { /* ... */ };Link* erase(Link* p);// 移除p并返回p之前的链接// ...};List::Link* List::erase(Link* p) { /* ... */ }
第一个List::是必需的,这仅是因为List的作用域直到第二个List::才有效。更好的表示方式是:
auto List::erase(Link* p) -> Link* { /* ... */ }
现在,将函数返回类型后置,Link*就不需要使用明确的List::进行限定了。
参考:
- the C++ draft section ???
- [Str02] Bjarne Stroustrup. Draft proposal for “typeof”. C++ reflector message c++std-ext-5364, October 2002.
- [N1478=03-0061] Jaakko Jarvi, Bjarne Stroustrup, Douglas Gregor, and Jeremy Siek:
Decltype and auto. - [N2445=07-0315] Jason Merrill:
New Function Declarator Syntax Wording. - [N2825=09-0015] Lawrence Crowl and Alisdair Meredith:
Unified Function Syntax.
0 0
- C++11 FAQ中文版:返回值类型后置语法
- C++11 FAQ中文版:返回值类型后置语法
- 【C++11学习笔记】返回类型后置语法
- 【C++11学习笔记】返回类型后置语法
- C++11返回类型后置语法的使用
- C++返回类型后置
- Objective-C FAQ 中文版
- C++0x新特性:decltype类型指示符与返回类型后置语法
- C++0x新特性:decltype类型指示符与返回类型后置语法
- auto decltype 用于返回值类型后置时的占位
- auto decltype 用于返回值类型后置时的占位
- Objective-C FAQ 中文版(转贴)
- C++11 FAQ中文版
- C++11 FAQ中文版
- C++11 FAQ中文版:array
- C++11 FAQ中文版:unique_ptr
- C++11 FAQ中文版:weak_ptr
- C++11 FAQ中文版:array
- servlet服务器端和android端json交互
- dojo API中英文缩写的意思
- java中hashmap和hashtable的区别 ——面试篇
- C++11 FAQ中文版:序列for循环语句
- 电脑系统坏了怎么重装???
- C++11 FAQ中文版:返回值类型后置语法
- USB转串口 FT232/PL2303/CH340 驱动以及使用体会
- 实现自己的Toast
- Shell
- 传智学习日志篇:十四
- 市委组织部项目--下拉框简单操作
- C++11 FAQ中文版:类成员的内部初始化
- 运行Struts项目时出现java.lang.reflect.InvocationTargetException异常解决办法
- C++11 FAQ中文版:继承的构造函数