运营商<<<在std命名空间吗?

时间:2013-10-19 03:52:27

标签: c++

当然以下代码可以工作(它调用std :: cout :: operator<<):

cout << 1 << '1' << "1" << endl;

发现还有std :: operator&lt;&lt;,它似乎只适用于char或char *参数:

operator<<(cout, '1'); // ok
operator<<(cout, "1"); // ok
operator<<(cout, 1);   // error

那么为什么我们需要这个运算符以及如何使用它?

感谢。

2 个答案:

答案 0 :(得分:7)

operator<<(cout, '1'); // ok
operator<<(cout, "1"); // ok
operator<<(cout, 1);   // error

前两个是有效的,因为它们调用带有两个参数的非成员函数。将charchar const*作为参数的函数定义为非成员(免费)函数。

但是,将int作为参数的函数定义为成员函数,这意味着第三个函数需要调用成员函数。如果您将其作为非成员函数调用,则必须将int转换为某些类型的,其中存在非成员函数。因此,当考虑这种转换时,会导致模糊,因为有许多可能的转换同样有效。

如上所述,这应该有效:

cout.operator<<(1); //should work

至于为什么某些功能被定义为成员而其他功能被定义为非成员,我不知道答案。它需要对提案和导致这种图书馆设计的决策进行大量研究。

答案 1 :(得分:0)

我始终理解charunsigned charchar*被定义为非成员函数以外的basic_ostream类的原因是它更容易超载它们。

请参阅,所有其他operator<<使用char作为构建块。因此,如果您要创建专门针对特定ostream字符类型和/或charT特征类型的traits,您只需要专门化这些operator<<函数。

如果它们是成员函数,你必须专门研究整个类(基本上重新创建所有类成员函数)。

我不确定这是唯一的原因,但这就是我一直以来的看法。