- 一直对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
这个表达式,那么不能用变量接收函数返回结果
-
返回
void
直接调用lambda
[](){ std::cout << "test" << std::endl; }();
函数不返回任何值时为 void,当然不能用
auto
变量去推导返回类型错误写法:
auto ans = [](){ std::cout << "test" << std::endl; }();
-
离奇写法(正确),声明
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; }();
-
一般用法
auto func = [](){ std::cout << "test" << std::endl; }; func();