我原以为它们是一样的,但当我向在线评测系统发送了一段代码(带有 endl(cout)
),它给出了“错误答案”的判决。然后我尝试用 cout << endl
发送另一个代码,这次评测系统接受了我的代码!是否有人知道这些命令之间的区别?
据我所知,没有这样的内容。
std::endl
是一个函数,它接受一个流(stream)并返回一个流:
ostream& endl ( ostream& os );
当你将它应用于std::cout
时,它会立即应用该函数。
另一方面,std::basic_ostream
有一个重载的operator<<
,其签名为:
template <typename C, typename T>
basic_ostream<C,T>& operator<<(basic_ostream<C,T>& (*pf)(basic_ostream<C,T>&));
这也会立即应用该函数。
因此,技术上讲,没有差别,即使流中使用std::cout << std::endl
更符合惯用语法。 可能评判机器人比较简单,没有意识到这一点。
cout << endl
时只有一个函数调用,而这里则有两个。 - Seth Carnegieendl
不应该转换为 ios_base& (*pf)(ios_base&)
,如果我没记错的话,还有另一个重载。 - Xeoendl
无法转换为 ios_base& (*pf)(ios_base&)
,因为其参数和返回类型必须是 basic_ostream
的特化。不过,basic_ostream
有一个模板成员:basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>& (*pf)(basic_ostream<charT,traits>&));
。 - CB Baileyendl(cout)
被认为是全局函数,而在cout << endl
中,endl
被认为是一个操作器。但它们的效果相同。<< endl;
还是 endl(cout)
,它可以减少代码中的行数。cout << "Hello World" << endl;
或者
cout << "Hello World";
endl(cout);
然而,
cout << "Hello World" << endl(cout);
//不起作用这两种形式的行为没有区别。它们都指向相同的endl
函数,该函数可以用作操纵符(cout << endl
)或自由函数(endl(cout)
)。
using std::cout
,那么第一种形式将会编译通过,但是第二种形式不会(由于参数相关查找)。我想不出第二种形式能够工作而第一种形式不能的情况,就像在线评测机的情况一样。 - interjay