std :: endl的结构

Gok*_*tug 7 c++ c++-standard-library endl

我是C++的新手,我很困惑std::endl.当我试图了解它是什么时std::endl,我遇到了一些资源,告诉我这是一个功能.

但是,如何将功能剥夺括号?

gsa*_*ras 6

阅读参考:

std::endl

插入换行符并刷新流.

例如,它与流一起使用std::cout.

它不是一个功能,它是一个功能模板.

std::endl没有括号是指一组重载函数 - 该函数模板的所有可能的特化.阅读更多内容如果std :: endl是一个函数,它如何不使用任何括号?


Rei*_*ica 4

但是,函数怎么能去掉括号呢?

函数的名称(后面不跟())只是对该函数的引用。它与任何其他类型完全相同:

void foo(int) {}

char x = 'a';

char *p = &x;

int main()
{
  p;  // Refers to p
  *p; // Dereferences p (refers to whatever p points to)
  foo;  // Refers to foo
  foo(42); // Calls foo
}
Run Code Online (Sandbox Code Playgroud)

std::endl是一个函数(实际上是一个函数模板),它采用一个“流”类型的参数,并通过将 EOL 表示插入该流然后刷新它来工作。实际上,如果您愿意,您可以像任何其他函数一样使用它:

std::endl(std::cout);
Run Code Online (Sandbox Code Playgroud)

难题的最后一部分是标准库提供了一个重载(同样是一个模板),operator <<使得 LHS 参数是一个流,RHS 参数是一个函数;该运算符的实现调用 RHS 参数(函数)并将其传递给 LHS 参数(流)。从概念上讲,有这样的事情:

Stream& operator<< (Stream &s, const Function &f)
{
  f(s);
  return s;
}
Run Code Online (Sandbox Code Playgroud)

因此,调用std::cout << std::endl会调用该运算符重载,后者又会调用std::endl(std::cout),从而执行 EOL 插入+刷新。

至于首选哪种形式(直接调用还是<<运算符),肯定是使用<<. 它很惯用,并且允许在单个表达式中轻松组合多个流操纵器。像这样:

std::cout << "Temperature: " << std::fixed << std::setprecision(3) << temperature << " (rounds to " << std::setprecision(1) << temperature << ')' << std::endl;
Run Code Online (Sandbox Code Playgroud)

  • @Arrrow您正在尝试将`std::endl(std::cout)`函数的返回值发送到流`std::cout`,这是流引用,所以您正在做`std::cout &lt;&lt; std::cout`,中间通过 `endl` 函数将 EOL 发送到流。即没有多大意义。 (2认同)