lambda表达式后的()

  • 一直对lambda后面的()这种离奇的语法感到奇怪,今天看到如下代码:
auto optimize_cpp_stdio = []() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
    std::setvbuf(stdout, nullptr, _IOFBF, BUFSIZ);
    return 0;
}();

  • 沙雕的以为是声明函数对象?
  • 但是optimize_cpp_stdio接收的是函数调用后的返回值而已

没有()是定义函数对象
// 定义了一个函数对象
auto func = [](){ std::cout << "test" << std::endl; };
func(); //然后调用该函数对象

c++11 中

C++11允许lambda函数根据return语句的表达式类型推断返回类型。C++14为一般的函数也提供了这个能力。

  • 返回类型若缺失,则由函数的 return 语句所蕴含(或当函数不返回任何值时为 void
lambda后有() 等价于 直接调用函数对象并且返回值,
  • 如果lambda函数没有return这个表达式,那么不能用变量接收函数返回结果
  1. 返回void直接调用lambda

    [](){
            std::cout << "test" << std::endl;
        }();
    

    函数不返回任何值时为 void,当然不能用auto变量去推导返回类型

    错误写法:

    auto ans = [](){
     	std::cout << "test" << std::endl;
    }();
    
  2. 离奇写法(正确),声明lambda且调用,

    auto optimize_cpp_stdio = []() {
        std::ios::sync_with_stdio(false);
        std::cin.tie(nullptr);
        std::cout.tie(nullptr);
        std::setvbuf(stdout, nullptr, _IOFBF, BUFSIZ);
        return 0;
    }();
    
  3. 一般用法

    auto func = [](){
            std::cout << "test" << std::endl;
        };
    func();
    

这种写法[](){}();确实让人挺窒息的,但是要清楚()无非就是 函数调用 而已,
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值