为什么operator << std :: ostream和char之间的函数是非成员函数?

R S*_*ahu 36 c++ ostream c++11

当我运行以下程序时

#include <iostream>

int main()
{
   char c = 'a';
   std::cout << c << std::endl;
   std::cout.operator<<(c) << std::endl;

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

我得到了输出

a
97
Run Code Online (Sandbox Code Playgroud)

http://en.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt进一步挖掘,我注意到std::ostream::operator<<()没有char作为参数类型的重载.函数调用std::cout.operator<<(a)被解析为std::ostream::operator<<(int),这解释了输出.

我假设和operator<<之间的函数在其他地方声明为:std::ostreamchar

std::ostream& operator<<(std::ostream& out, char c);
Run Code Online (Sandbox Code Playgroud)

否则,std::cout << a将解决std::ostream::operator<<(int).

我的问题是为什么声明/定义为非成员函数?是否存在阻止其成为会员功能的已知问题?

AnT*_*AnT 12

该组插入器为std::basic_ostream包括用于插入部分特例char,signed char,unsigned char并且这种成basic_ostream<char, ...>流.请注意,这些特化basic_ostream<char, ...>仅适用于流,不适用于basic_ostream<wchar_t, ...>基于任何其他字符类型的流或流.

如果将这些独立模板移动到主要basic_ostream定义中,它们将可用于所有专业化形式basic_ostream.显然,图书馆作者希望防止这种情况发生.

我真的不知道为什么他们想在更通用的基础上引入这些专业

template<class charT, class traits>
basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&,
                                        char);
Run Code Online (Sandbox Code Playgroud)

插入器,但显然他们有他们的理由(优化?).

C字符串插入器也存在相同的情况.除了更通用的插件

template<class charT, class traits>
basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&,
                                        const char*);
Run Code Online (Sandbox Code Playgroud)

库规范也声明更具体

template<class traits>
basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&,
                                       const char*);
Run Code Online (Sandbox Code Playgroud)

等等.

  • 我不确定我完全理解你的答案:有一个通用的`template <class charT,class traits> basic_ostream <charT,traits>&operator <<(basic_ostream <charT,traits>&out,char c); `功能模板适用于`wchar_t`. (2认同)

sno*_*ion 5

一个原因是遵循一般的 C++ 建议,即优先使用非成员非友元函数而不是成员函数。这是 Scott Meyer 的Effective C++ 中23 项。这在stackoverflow 中进行了讨论。

  • 很高兴提到这一点。这个经验法则似乎很多程序员都不知道,导致god object or object orgy antipatterns…… (2认同)