【发布时间】:2015-07-07 16:54:51
【问题描述】:
当我运行以下程序时
#include <iostream>
int main()
{
char c = 'a';
std::cout << c << std::endl;
std::cout.operator<<(c) << std::endl;
return 0;
}
我得到了输出
a
97
进一步挖掘http://en.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt,我注意到std::ostream::operator<<() 没有以char 作为参数类型的重载。函数调用 std::cout.operator<<(a) 被解析为 std::ostream::operator<<(int),这解释了输出。
我假设std::ostream 和char 之间的operator<< 函数在其他地方声明为:
std::ostream& operator<<(std::ostream& out, char c);
否则,std::cout << a 将解析为 std::ostream::operator<<(int)。
我的问题是为什么声明/定义为非成员函数?是否有任何已知问题阻止它成为成员函数?
【问题讨论】:
-
可能是因为字符类型模板参数?通过使用语言环境的
widen,此函数可以对任何字符类型具有相同(“高效”)的实现。 -
有趣的话题。可能是what was discussed here 不起作用的原因。
-
@dyp,这似乎不太令人信服。
-
好吧,现在对于所有流,我们有一个
operator<<采用charT和一个operator<<采用char。由于charT可以——而且经常是——char,作为成员,这将是一件棘手的事情。