C++ 如果std::endl是函数,它如何不使用任何括号?

C++ 如果std::endl是函数,它如何不使用任何括号?,c++,visual-studio-2010,std,C++,Visual Studio 2010,Std,问题就在标题里。根据std::endl实际上是一个函数。查看其在中的声明,可以验证这一点 但是,当您使用std::endl时,您不会使用std::endl()。相反,您使用: std::cout << "Foo" << std::endl; std::coutstd::endl是某种类型的对象(不是很重要),作为参数提供给操作符std::endl是一个声明的函数模板(27.7.3.8): 定义为具有返回pf(*this)(27.7.3.6.3)的效果 不带括号的std:

问题就在标题里。根据std::endl实际上是一个函数。查看其在
中的声明,可以验证这一点

但是,当您使用
std::endl
时,您不会使用
std::endl()
。相反,您使用:

std::cout << "Foo" << std::endl;

std::cout
std::endl
是某种类型的对象(不是很重要),作为参数提供给
操作符
std::endl
是一个声明的函数模板(27.7.3.8):

定义为具有返回
pf(*this)
(27.7.3.6.3)的效果


不带括号的
std::endl
是指一组重载函数-函数模板的所有可能的专门化,但用于一种特定类型的函数指针可接受的上下文中(即作为
运算符的参数,尽管它是函数[模板],标准流操纵器被设计为作为函数指针(或函子对象引用)发送到流。插入函数调用的结果只会给出该函数调用产生的值


这意味着你流函子本身(<代码> f>代码>),而不是调用它的结果(<代码> f>(代码)>。< /p>虽然不是重复的问题,这里的答案回答了你的问题:谢谢你的链接。它确实充分地解释了它:<代码> STD::NoDL/COD>不是一个对象(在C++意义上),它是一个函数模板…这就是为什么没有

std::wendl
。事后看来,我不确定这是否是一件好事。@MSalters:我不确定这是什么原因。@Tomalak:嗯,有
'\n'
和一个不同的
L'\n'
。如果你把
endl
看作像
'\n'
那样的对象,你会期待
wendl
@MSalters:我同意!这就是为什么我不明白
endl
是如何两者兼而有之的原因。注意:我的手机确实需要一个backtick键。
std::endl
不是一个带有
操作符()的类。
;这是一个函数模板。谢谢你的解释!有没有一种方法可以将std::endl传递给类,如下所示:对于那些想知道的人,是的,您可以执行
std::ostream&some_func(std::ostream&stream){返回流
template <class charT, class traits>
basic_ostream<charT,traits>& endl(basic_ostream<charT,traits>& os);
basic_ostream<charT,traits>& operator<<
    ( basic_ostream<charT,traits>& (*pf)(basic_ostream<charT,traits>&) );