为什么我可以在 lambda 中使用 ostream cout,尽管它没有被捕获?
Why can I use ostream cout in a lambda although it wasn't captured?
这个lambda失败了,因为我还没有捕获变量:
int main()
{
int val = 5;
auto lambda = []{ return val; }; // error: val wasn't captured.
lambda();
}
但是, ostream cout 虽然没有捕获?
int main()
{
auto lambda = []{ cout << endl; }; // works
}
这是因为std::cout
是按照以下方式定义的(在<iostream>
标头中):
#include <ios>
#include <streambuf>
#include <istream>
#include <ostream>
namespace std {
extern istream cin;
extern ostream cout;
extern ostream cerr;
extern ostream clog;
extern wistream wcin;
extern wostream wcout;
extern wostream wcerr;
extern wostream wclog;
}
虽然您的val
变量是在本地定义的(即在函数/类的范围中)。
相关文章:
- 函数向量_指针有不同的原型,我可以构建一个吗
- 我可以使用 g++ 进行三种比较 (<=>) 吗?
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 我可以信任表示整数的浮点或双精度来保持精度吗
- 我可以将调用类的"this"传递给 lambda 函数吗?
- 我可以在这里替换什么,因为我不能在 C# 中使用隐式变量的 lambda 函数?
- 我可以使用 lambda 来简化 for 循环吗?
- 我可以让返回类型自动处理具有相同签名但捕获不同内容的 lambda 吗?
- 为什么我可以在 C++ 的可变 lambda 中捕获未声明的变量
- 我可以在模板参数中声明一个 constexpr lambda 吗?
- 我可以将C 17 Capture lambda ConstexPR转换操作符的结果用作函数指针模板非类型参数吗?
- 为什么我可以在 lambda 中使用 ostream cout,尽管它没有被捕获?
- 我可以将 std::function (C++11 lambda) 与 Boost 一起使用吗?
- 我可以在Visual Studio中的Lambda中定义一个模板化函数
- 我可以定义一个没有auto的C++lambda函数吗
- 我可以在std::函数中使用模板类型T来传递lambda类型的函数C++11吗
- 我可以强制c++ 11的lambda通过引用返回吗?
- 我可以做一个有相同签名的String + lambda表吗?
- 我可以在lambda中使用可变模板吗
- 我可以有主窗口过程作为一个lambda在WinMain