有人知道endl(cout)和cout << endl之间的区别吗?

4

我原以为它们是一样的,但当我向在线评测系统发送了一段代码(带有 endl(cout)),它给出了“错误答案”的判决。然后我尝试用 cout << endl 发送另一个代码,这次评测系统接受了我的代码!是否有人知道这些命令之间的区别?


如果你使用了 using std::cout,那么第一种形式将会编译通过,但是第二种形式不会(由于参数相关查找)。我想不出第二种形式能够工作而第一种形式不能的情况,就像在线评测机的情况一样。 - interjay
4个回答

3

据我所知,没有这样的内容。

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 Carnegie
非常感谢!将来我将仅使用cout << endl :) - hinafu
等一下,endl 不应该转换为 ios_base& (*pf)(ios_base&),如果我没记错的话,还有另一个重载。 - Xeo
endl 无法转换为 ios_base& (*pf)(ios_base&),因为其参数和返回类型必须是 basic_ostream 的特化。不过,basic_ostream 有一个模板成员:basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>& (*pf)(basic_ostream<charT,traits>&)); - CB Bailey

2
唯一的区别是endl(cout)被认为是全局函数,而在cout << endl中,endl被认为是一个操作器。但它们的效果相同。

1
上面的答案是正确的!此外,根据您使用的是 << endl; 还是 endl(cout),它可以减少代码中的行数。
例如:
您可以这样写: cout << "Hello World" << endl; 或者 cout << "Hello World"; endl(cout); 然而, cout << "Hello World" << endl(cout);//不起作用
因此,在这个例子中,它是2行代码与1行代码的区别。

1

这两种形式的行为没有区别。它们都指向相同的endl函数,该函数可以用作操纵符(cout << endl)或自由函数(endl(cout))。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接