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

And*_* DM 8 c++ lambda c++11

这个lambda失败了因为我没有捕获变量:

int main()
{
    int val = 5;
    auto lambda = []{ return val; };  // error: val wasn't captured.
    lambda();
}
Run Code Online (Sandbox Code Playgroud)

但是为什么ostream cout工作虽然它没有被捕获?

int main()
{
    auto lambda = []{ cout << endl; };  // works
}
Run Code Online (Sandbox Code Playgroud)

syn*_*gma 13

这是因为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;
}
Run Code Online (Sandbox Code Playgroud)

而你的val变量是在本地定义的(即在函数/类的范围内).