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

时间:2015-05-04 22:02:33

标签: c++ c++11 lambda

这个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
}

1 个答案:

答案 0 :(得分: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;
}

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