一句话,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返回类型自动推导的一些需要注意的地方的更多相关文章

  1. C++ 11 学习1:类型自动推导 auto和decltype

    Cocos 3.x 用了大量的C++ 11 的东西,所以作为一个C++忠实粉丝,有必要对C++ 11进行一个系统的学习. 使用C++11之前,一定要注意自己使用的编译器对C++11的支持情况,有些编译 ...

  2. C++ auto 完成类型自动推导与使用

    c++11 允许声明一个变量或对象(object)而不需要指明其类型,只需说明它是auto. 1.如: auto i = 42: //i是整型 double   f(); auto d=f(); // ...

  3. EF调用sp,EF自动生成返回类型

    在sp中添加下面的红色部分,就是执行sp时的返回类型,后面在EF中添加该sp后,EF会在DBContext文件中,自动生成调用该sp的代码,包括返回类型等,如下: public virtual Obj ...

  4. C++11的auto自动推导类型

    auto是C++11的类型推导关键字,很强大 例程看一下它的用法 #include<vector> #include<algorithm> #include<functi ...

  5. C++11 自动推导auto

    C++11 自动推导auto C++11中引入的auto主要有两种用途:自动类型推导和返回值占位. auto在C++98中的标识临时变量的语义,由于使用极少且多余,在C++11中已被删除.前后两个标准 ...

  6. lamda表达式和尾置返回类型

    基本lambda语法 基本形式如下: [capture](parameters) mutable ->return-type {body} [capture]:叫做捕获说明符,表示一个lambd ...

  7. C++ 函数模板的返回类型如何确定?

    函数模板 #include <iostream> // 多个参数的函数木板 template<typename T1, typename T2> T2 max(T1 a, T2 ...

  8. C/C++函数调用的几种方式及函数名修饰规则以及c++为什么不允许重载仅返回类型不同的函数

    我们知道,调用函数时,计算机常用栈来存放函数执行需要的参数,由于栈的空间大小是有限的,在windows下栈是向低地址扩展的数据结构,是一块连续的内存区域.这句话的意思是栈顶的地址和栈的最大容量是系统预 ...

  9. Scalaz(27)- Inference & Unapply :类型的推导和匹配

    经过一段时间的摸索,用scala进行函数式编程的过程对我来说就好像是想着法儿如何将函数的款式对齐以及如何正确地匹配类型,真正是一种全新的体验,但好像有点太偏重学术型了. 本来不想花什么功夫在scala ...

随机推荐

  1. Oracle 递归函数与等级

    --基数数据1 SELECT ID, mt.materialtypename, mt.parenttypeid FROM material_type mt; 使用递归还是与LEVEL 1 SELECT ...

  2. swift入门-day01-基本语法

    主要内容: 1.常量和变量 2.Optional 3.控制流 4.循环 5.字符串 6.集合 变量和常量 定义 let 定义常量,一经赋值不允许再修改 var 定义变量,赋值之后仍然可以修改 自动推导 ...

  3. 获取通讯录的信息(关于iOS9.0之后新的框架-ContactFramework)

    转载自:http://my.oschina.net/u/2340880/blog/511995?p={{totalPage}} 一.引言 在以前iOS开发中,涉及联系人相关的编程,代码都非常繁琐,并且 ...

  4. Mac apache配置问题解决

    AH00526: Syntax error on line 20 of /private/etc/apache2/extra/httpd-mpm.conf: Invalid command 'Lock ...

  5. java String字符串——进度1

    String字符串    在JAVA中提供了多种创建字符串对象的方法,这里介绍最简单的两种,    第一种是直接赋值,    第二种是使用String类的构造方法:    如下所示:    Strin ...

  6. 青瓷qici - H5小游戏 抽奖机 0 创建工程

    安装运行平台需要nodejs,具体方法请参照官方说明文档. 运行后打开了一个空空的窗口. 首先我们进行工程设置,菜单>工程>设置 菜单里面设置我们游戏的名称,到时候会显示在游戏的title ...

  7. jQuery登陆判断简单实现代码

    登陆判断在实际应用中还是比较常见,在客户端执行判断可以减少服务器端的负担,感兴趣的朋友可以参考下 复制代码代码如下: <script src="jquery-1.9.1.js" ...

  8. 编写留言板是遇到的mysql中文乱码问题

    mysql中文显示,需要编码统一,数据库链接文件,database,table编码均要设置一致

  9. SQL SERVER 2008 使用TDE加密和解密

    SQL SERVER 2008 加密和解密,这样的文件在互联网上不胜枚举,本文的寓意还是一样,一为记录,二可以为开发者提供在实现过程中的注意事项. TDE: Transparent data encr ...

  10. 安卓手机无法连接VPN的解决办法

    这篇不能算是技术博客吧,但是在网上很难找到解决方案,至少我找了好久也没弄好.. 三种方案,因机而异,我就长话短说了: 一. "/system/xbin" 和 "/syst ...