首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >性病的结构::endl

性病的结构::endl
EN

Stack Overflow用户
提问于 2017-09-21 11:20:49
回答 3查看 527关注 0票数 7

我是C++的新手,我对std::endl感到困惑。当我试图理解std::endl是什么时,我遇到了一些资源,这些资源告诉我它是一个函数。

然而,如何才能剥夺一个函数的括号呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-09-21 11:37:30

然而,如何才能剥夺一个函数的括号呢?

函数的名称(没有后面跟着() )只是对该函数的引用。它和任何其他类型都完全一样:

代码语言:javascript
复制
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表示插入到该流中,然后刷新它。实际上可以像使用任何其他函数一样使用它,如果您想:

代码语言:javascript
复制
std::endl(std::cout);

最后一个难题是,标准库提供了operator <<的过载(同样是模板),因此LHS参数是流,RHS参数是函数;该操作符的实现调用RHS参数(函数)并将其传递给LHS参数(流)。从概念上讲,有这样的东西:

代码语言:javascript
复制
Stream& operator<< (Stream &s, const Function &f)
{
  f(s);
  return s;
}

因此,调用std::cout << std::endl会调用操作符重载,然后调用std::endl(std::cout),后者执行EOL插入+刷新。

至于首选哪种形式(直接调用与<<操作符),这肯定是<<的使用。它是惯用的,它允许在一个表达式中简单地组合多个流操作器。如下所示:

代码语言:javascript
复制
std::cout << "Temperature: " << std::fixed << std::setprecision(3) << temperature << " (rounds to " << std::setprecision(1) << temperature << ')' << std::endl;
票数 4
EN

Stack Overflow用户

发布于 2017-09-21 11:24:05

阅读参考

std::endl 插入新行字符并刷新流。

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

它不是一个函数,而是一个函数模板。

没有括号的std::endl指的是一组重载函数--该函数模板的所有可能的专门化。在如果是函数,那么std::endl如何不使用任何括号?中阅读更多内容

票数 6
EN

Stack Overflow用户

发布于 2017-09-21 11:26:21

恩德尔是一个只输出的I/O机械手。

endl是一个只有输出的I/O操作程序,它可以用表达式(如out << std::endl )来调用,用于任何类型以外的std::basic_ostream。 将换行符插入输出序列os中,并将其刷新,就像调用os.put(os.widen('\n')),然后调用os.flush()一样。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46342612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档