C++lambda表达式什么情况下能推断返回类型

C++primer中所说的编译器会推断return_type的情况,翻译原文如下:

“如果函数体只是一个return语句,则返回类型从返回的表达式的类型推断而来。否则,返回类型为void。”

那么,今天我们来验证一下这句话是否正确。

示例1:

#include <iostream>
int main () {
    auto f = [](int a, int b) {
        return a + b;
    };
    std::cout << typeid(f(1, 1)).name() << std::endl;
}

上面示例函数体只有单一return语句且缺省return_typetypeid(f(1, 1)).name()用于检测返回类型。

输出:

i

代表其返回值为int

这个实验验证了“如果函数体只是一个return语句,则返回类型从返回的表达式的类型推断而来。”这句话的正确性。但是后半句话“否则,返回类型为void。”是否正确呢?

示例2:

#include <iostream>
int main () {
    auto f = [](int a, int b) {
        // 增加内容起始位置
        std::cout << "try to do something" << std::endl;
        a *= 10;
        b *= 10;
        // 增加内容终止位置
        return a + b;
    };
    std::cout <<  typeid(f(1, 1)).name() << std::endl;
}

这段代码在示例1的基础上增加了三行代码,进行简单输出与简单计算。但是编译器仍然完成了类型推断。

输出:

i

仍然正确推断返回类型。

示例3:

#include <iostream>
int main () {
    auto f = [](int a, int b) {
        std::cout << "try to do something" << std::endl;
        // 修改内容起始位置
        if(a) {
            a *= 10;
            b *= 10;
            return a + b;
        } else {
            return a - b;
        }
        // 修改内容终止位置
    };
    std::cout <<  typeid(f(1, 1)).name() << std::endl;
}

上面代码增加了if_else分支语句,每条分支上都存在一个return语句,但是return的值都是int类型。

输出:

i

仍然能正确推断出返回类型。

示例2和示例3说明:即使函数体不止一个return语句,返回类型也可以从返回的表达式的类型推断而来。

那么在什么情况下,编译器无法完成类型推断的工作呢?

示例4:

#include <iostream>
int main () {
    auto f = [](int a, int b) {
        std::cout << "try to do something" << std::endl;
        if(a) {
            a *= 10;
            b *= 10;
            return a + b;
        } else {
            // 修改内容起始位置
            return "string_type";
            // 修改内容终止位置
        }
    };
    std::cout <<  typeid(f(1, 1)).name() << std::endl;
}

上述代码在示例3的基础上修改了第二条分支语句的return a + breturn "string_type",即两条分支语句拥有不同的返回类型,这个时候语法检查会提醒deduced return type "const char *" conflicts with previously deduced type "int"C/C++(2546),即“推断出的返回类型 ‘const char *’ 与之前推断出的类型 ‘int’ 冲突”。所以这种情况下,lambda是没有办法推断出返回类型的。

综上,C++primer中的那段话并不完全正确。只要你所有return语句都使用相同的类型,那么返回类型就可以由编译器自动推断。

  • 13
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值