当然以下代码可以工作(它调用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
那么为什么我们需要这个运算符以及如何使用它?
感谢。
答案 0 :(得分:7)
operator<<(cout, '1'); // ok
operator<<(cout, "1"); // ok
operator<<(cout, 1); // error
前两个是有效的,因为它们调用带有两个参数的非成员函数。将char
和char const*
作为参数的函数定义为非成员(免费)函数。
但是,将int
作为参数的函数定义为成员函数,这意味着第三个函数需要调用成员函数。如果您将其作为非成员函数调用,则必须将int
转换为某些类型的,其中存在非成员函数。因此,当考虑这种转换时,会导致模糊,因为有许多可能的转换同样有效。
如上所述,这应该有效:
cout.operator<<(1); //should work
至于为什么某些功能被定义为成员而其他功能被定义为非成员,我不知道答案。它需要对提案和导致这种图书馆设计的决策进行大量研究。
答案 1 :(得分:0)
我始终理解char
,unsigned char
和char*
被定义为非成员函数在以外的basic_ostream
类的原因是它更容易超载它们。
请参阅,所有其他operator<<
使用char
作为构建块。因此,如果您要创建专门针对特定ostream
字符类型和/或charT
特征类型的traits
,您只需要专门化这些operator<<
函数。
如果它们是成员函数,你必须专门研究整个类(基本上重新创建所有类成员函数)。
我不确定这是唯一的原因,但这就是我一直以来的看法。