13

当然以下代码有效(它调用 std::cout::operator<<):

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

碰巧发现还有 std::operator<<,它似乎只适用于 char 或 char* 参数:

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

那么为什么我们需要这个操作符以及如何使用它呢?

谢谢。

4

2 回答 2

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

前两个有效,因为它们调用带有两个参数的非成员函数。接受charchar const*作为参数的函数被定义为非成员(自由)函数。

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

如前所述,这应该有效:

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

至于为什么有些函数被定义为成员,而另一些函数被定义为非成员,我不知道答案。它需要对导致图书馆设计的提案和决定进行大量研究。

于 2013-10-19T04:20:54.190 回答
0

我一直理解char,unsigned char并被定义为类之外char*非成员函数的原因,因此更容易重载它们。basic_ostream

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

如果它们是成员函数,您将不得不专门化整个类(基本上是重新创建所有类成员函数)。

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

于 2013-10-19T07:24:19.840 回答