为什么我可以在 lambda 中使用 ostream cout,尽管它没有被捕获?

Why can I use ostream cout in a lambda although it wasn't captured?

本文关键字:lambda 我可以 cout ostream 为什么      更新时间:2023-10-16

这个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变量是在本地定义的(即在函数/类的范围中)。