std :: endl的结构

时间:2017-09-21 11:20:50

标签: c++ c++-standard-library endl

我是C ++的新手,我对taskkill感到困惑。在试图了解std::endl是什么时,我遇到了一些资源,告诉我这是一个功能。

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

3 个答案:

答案 0 :(得分:6)

阅读ref

  

std::endl

     

插入换行符并刷新流。

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

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

没有括号的

std::endl指的是一组重载函数 - 该函数模板的所有可能的特化。阅读How does std::endl not use any brackets if it is a function?

中的更多内容

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

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

std::endl(std::cout);

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

Stream& operator<< (Stream &s, const Function &f)
{
  f(s);
  return s;
}

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

关于哪种形式是首选(直接调用vs. <<运算符),它绝对是<<的使用。它是惯用的,它允许在单个表达式中轻松组合多个流操纵器。像这样:

std::cout << "Temperature: " << std::fixed << std::setprecision(3) << temperature << " (rounds to " << std::setprecision(1) << temperature << ')' << std::endl;

答案 2 :(得分:0)

endl是一个仅输出的I / O操纵器。

  

endl是一个仅输出的I / O操纵器,对于out << std::endl类型的任何类型,可以使用std::basic_ostream等表达式调用它。

     

在输出序列os中插入换行符并将其刷新,就像调用os.put(os.widen('\n'))后跟os.flush()一样。