当然,以下代码可以工作(它调用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
关于为什么有些函数被定义为成员函数,而有些则是非成员函数,我不知道答案。这需要对库的设计提案和决策进行大量研究。
std
命名空间中甚至有一个operater<<
的定义,而不是为什么它失败了。但是关于它为什么失败的信息很有用。 - Brandon Buck<<
。我的观点是,原因实际上可能纯粹与历史偶然有关... - Donal Fellows我一直理解 char
、unsigned char
和 char*
被定义为非成员函数 在 basic_ostream
类之外的原因是为了更容易地重载它们。
你看,所有其他的 operator<<
都使用 char
作为构建块。因此,如果你想创建一个专门针对特定 charT
字符类型和 / 或 traits
特性类型的 ostream
- 你只需要专门化这些 operator<<
函数。
如果它们是成员函数,你就必须专门化整个类(基本上重新创建所有类成员函数)。
我不确定这是唯一的原因,但这是我一直以来的看法。