当然以下代码有效(它调用 std::cout::operator<<):
cout << 1 << '1' << "1" << endl;
碰巧发现还有 std::operator<<,它似乎只适用于 char 或 char* 参数:
operator<<(cout, '1'); // ok
operator<<(cout, "1"); // ok
operator<<(cout, 1); // error
那么为什么我们需要这个操作符以及如何使用它呢?
谢谢。
当然以下代码有效(它调用 std::cout::operator<<):
cout << 1 << '1' << "1" << endl;
碰巧发现还有 std::operator<<,它似乎只适用于 char 或 char* 参数:
operator<<(cout, '1'); // ok
operator<<(cout, "1"); // ok
operator<<(cout, 1); // error
那么为什么我们需要这个操作符以及如何使用它呢?
谢谢。
operator<<(cout, '1'); // ok
operator<<(cout, "1"); // ok
operator<<(cout, 1); // error
前两个有效,因为它们调用带有两个参数的非成员函数。接受char
和char const*
作为参数的函数被定义为非成员(自由)函数。
但是,int
作为参数的函数被定义为成员函数,这意味着第三个需要调用成员函数。如果您将其作为非成员函数调用,则int
必须将其转换为存在非成员函数的某种类型。因此,当考虑这种转换时,它会导致歧义,因为有许多可能的转换同样好。
如前所述,这应该有效:
cout.operator<<(1); //should work
至于为什么有些函数被定义为成员,而另一些函数被定义为非成员,我不知道答案。它需要对导致图书馆设计的提案和决定进行大量研究。
我一直理解char
,unsigned char
并被定义为类之外的char*
非成员函数的原因,因此更容易重载它们。basic_ostream
看,所有其他人都operator<<
使用char
这些作为构建块。因此,如果您想创建一个ostream
专门针对特定charT
字符类型和/或traits
特征类型的函数 - 您只需专门化这些operator<<
函数。
如果它们是成员函数,您将不得不专门化整个类(基本上是重新创建所有类成员函数)。
我不确定这是唯一的原因,但这就是我一直看到的原因。