c++ lambda返回类型自动推导的一些需要注意的地方
一句话,lambda返回类型自动推导走的是auto,而不是decltype,注意。
class ObjectA
{
public:
ObjectA()
{
val_ = ++g;
} ObjectA(const ObjectA& other)
{
val_ = ++g;
} ~ObjectA()
{
val_ = ;
} ObjectA& operator=(const ObjectA& other)
{
if (this != &other)
{
val_ = ++g;
}
return *this;
} int val_;
}; const ObjectA& funcPlaceholder()
{
return ObjectA();
} class Test
{
public:
ObjectA& returnValue()
{
return val_;
} const ObjectA& returnConstValue() const
{
return val_;
} ObjectA val_;
}; void useRetValRef(std::function<ObjectA&()> func)
{
ObjectA& v = func();
} void useRetValConstRef(std::function<const ObjectA&()> func)
{
const ObjectA& v = func();
const ObjectA& v2 = funcPlaceholder();
} int main(int argc, wchar_t* argv[])
{
Test tt;
// 下面的lambda使用了自动返回类型推导->ObjectA,而不是ObjectA&,所以编译器报错,函数类型不匹配
// f的类型是ObjectA(),而使用f的要求是ObjectA&()
// auto f = [&tt](){return tt.returnValue();};
// useRetValRef(f);
// 下面这个情况也类似,j是ObjectA类型而不是ObjectA&
auto j = tt.returnValue();
j.val_ = ;
// 这样i就是ObjectA&了,decltype是编译时推导,不会产生任何运行时代码
decltype(tt.returnValue()) i = tt.returnValue();
i.val_ = ; tt.val_.val_ = ; // 下面会引起warning C4172: returning address of local variable or temporary,
// 因为lambda使用了自动返回类型推导->ObjectA,函数返回值,而不是引用
// 而使用f2的地方用const&接收了这个值,所以模版展开后出现类似这样的代码
/*
const ObjectA& func()
{
return ObjectA();
}
*/
auto f2 = [&tt]()
{
return tt.returnConstValue();
};
useRetValConstRef(f2); return ;
}
c++ lambda返回类型自动推导的一些需要注意的地方的更多相关文章
- C++ 11 学习1:类型自动推导 auto和decltype
		
Cocos 3.x 用了大量的C++ 11 的东西,所以作为一个C++忠实粉丝,有必要对C++ 11进行一个系统的学习. 使用C++11之前,一定要注意自己使用的编译器对C++11的支持情况,有些编译 ...
 - C++ auto 完成类型自动推导与使用
		
c++11 允许声明一个变量或对象(object)而不需要指明其类型,只需说明它是auto. 1.如: auto i = 42: //i是整型 double f(); auto d=f(); // ...
 - EF调用sp,EF自动生成返回类型
		
在sp中添加下面的红色部分,就是执行sp时的返回类型,后面在EF中添加该sp后,EF会在DBContext文件中,自动生成调用该sp的代码,包括返回类型等,如下: public virtual Obj ...
 - C++11的auto自动推导类型
		
auto是C++11的类型推导关键字,很强大 例程看一下它的用法 #include<vector> #include<algorithm> #include<functi ...
 - C++11 自动推导auto
		
C++11 自动推导auto C++11中引入的auto主要有两种用途:自动类型推导和返回值占位. auto在C++98中的标识临时变量的语义,由于使用极少且多余,在C++11中已被删除.前后两个标准 ...
 - lamda表达式和尾置返回类型
		
基本lambda语法 基本形式如下: [capture](parameters) mutable ->return-type {body} [capture]:叫做捕获说明符,表示一个lambd ...
 - C++ 函数模板的返回类型如何确定?
		
函数模板 #include <iostream> // 多个参数的函数木板 template<typename T1, typename T2> T2 max(T1 a, T2 ...
 - C/C++函数调用的几种方式及函数名修饰规则以及c++为什么不允许重载仅返回类型不同的函数
		
我们知道,调用函数时,计算机常用栈来存放函数执行需要的参数,由于栈的空间大小是有限的,在windows下栈是向低地址扩展的数据结构,是一块连续的内存区域.这句话的意思是栈顶的地址和栈的最大容量是系统预 ...
 - Scalaz(27)- Inference & Unapply :类型的推导和匹配
		
经过一段时间的摸索,用scala进行函数式编程的过程对我来说就好像是想着法儿如何将函数的款式对齐以及如何正确地匹配类型,真正是一种全新的体验,但好像有点太偏重学术型了. 本来不想花什么功夫在scala ...
 
随机推荐
- [转] c# 数据类型占用的字节数
			
http://www.cnblogs.com/laozuan/archive/2012/04/24/2467888.html
 - 项目由Windows2003 迁移到Windows 2008 过程,报 JS错误
			
这两天在做服务器迁移,遇到了一些小的问题,现在做个粗略的记录 原服务器环境:Windows 2003 现服务器环境:Windows 2008 其中SSB项目在迁移部署后发现,报 JS的错误. 我在想除 ...
 - C++数组(指针)作为函数参数
			
本文的学习内容参考:http://blog.csdn.net/wwdlk/article/details/6322843 1.当用数组名作为函数参数时,函数的实参和形参都应为数组名(或者指针): Ex ...
 - Html代码Font-Size中px与pt的区别
			
一个是设备坐标,一个是逻辑坐标,两者是不同的. px是个相对单位,一般像素的参考值为:在一个像素密度是90 pdi的显示器上,正常人从距离显示器28英寸处看一个像素的视角应该不小于0.0227度. 1 ...
 - PL/SQL学习(六)触发器
			
原文参考:http://plsql-tutorial.com/ 创建语法: CREATE [OR REPLACE ] TRIGGER trigger_name {BEFORE | AFTER | IN ...
 - jquery的return this.each()的作用
			
经常看到在运用jquery插件绑定事件时候,都会用到each. 下面来比较下使用return this和return this.each()在使用的区别. 注意:使用each的时候引用this,必须使 ...
 - ODBC方式连接Informix数据库
			
公司某个报表系统使用Informix数据库,在谋划使用Perl语言写数据采集程序后,花费了很多时间建立Perl访问Informix连接.恰巧Windows下ActivePerl的CPAN中又没有DBD ...
 - 【bzoj】1026: [SCOI2009]windy数
			
1026: [SCOI2009]windy数 Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B之间 ...
 - zzuli oj 1178 单词数
			
Description 统计一篇文章里不同单词的总数. Input 有多组数据,每组一行,每组就是一篇小文章.每篇小文章都是由小写字母和空格组成,没有标点符号,遇到#时表示输入结束. Output 每 ...
 - 问自己----也是自己该怎么走的路(phper)
			
1.首先看了PHP的源码API函数,对于许多口水仗的争论一笑而过,只是停留在脚本级别上的什么效率,安全...之争完全就是无稽之谈,没有深入理解API,所有的争论都是臆测和不科学的态度.你做了吗? 2. ...