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 ...
随机推荐
- Centos6.5 64linux系统基础优化(二)
1 操作的最小化原则 1)安装系统最小化 2)开启程序服务最小化原则 3)操作最小化原则 4)登陆最小化原则;平时没有需求不用root登陆,要用普通登陆. 2 更改ssh服务默认端口及常规配置 # ...
- OC加强-day06
#program mark - 08 NSMutableDictionary的使用 [掌握] "/08 NSMutableDictionary的使用/1_练习 "练习 1.小明的身 ...
- java之表达式陷阱
String str1 = "Hello Java的长度:10"; String str2 = "Hello Java的长度:10"; String str3 ...
- 安卓模拟器"bluestacks"在电脑上的设置.(宽,高)
可以在手机上找到大量英语学习APP. 习惯使用电脑的朋友,可以安装模拟器来使用这些APP. bluestacks 是一款比较好的模拟器. 但其默认的宽,高,却无法在软件中修改. 找到一个比较好的教程来 ...
- Codevs 1191 数轴染色
1191 数轴染色 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 在一条数轴上有N个点,分别是1-N.一开始所有的点都被染成黑色. ...
- C#使用Json
AJAX传递复杂数据如果自己进行格式定义的话会经历组装.解析的过程,因此AJAX中有一个事实上的数据传输标准JSon. Json将复杂对象序列化为一个字符串,在浏览器端再将字符串反序列化为JavaSc ...
- scala - 从合并两个Map说开去 - foldLeft 和 foldRight 还有模式匹配
开发中遇到需求:合并两个Map集合对象(将两个对应KEY的值累加) 先说解决方案: ( map1 )) ) } 这特么什么鬼 (╯‵□′)╯""┻━┻☆))>○<) ...
- Andriod 中常见错误
1.Open quote is expected for attribute "android:name" associated with an element type &quo ...
- C#面向对象的学习笔记
1.面向对象的3要素: 封装:将不需要显示的代码封装到一个方法中,只对外提供方法名,用户不需关心内部实现. 继承:子类继承父类,公用父类的代码,大大提高了代码的重用,贴近生活也符合人类的编程思想. 多 ...
- 水晶报表显示到aspx页面中
1.在前台添加水晶报表显示控件. <CR:CrystalReportViewer ID="CrystalReportViewer1" runat="server&q ...