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

标签 c++ c++11 ostream

当我运行以下程序时

#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) ,它解释了输出。

我假设 operator<< std::ostream 之间的函数和 char在别处声明为:

std::ostream& operator<<(std::ostream& out, char c);

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

我的问题是为什么声明/定义为非成员函数?是否有任何已知问题阻止它成为成员函数?

最佳答案

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);

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

C 字符串插入器也存在同样的情况。除了更通用的插入器

template<class charT, class traits>
basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&,
                                        const char*);

库规范还声明了更具体的

template<class traits>
basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&,
                                       const char*);

等等。

关于c++ - 为什么 std::ostream 和 char 之间的 operator<< 函数是非成员函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31274837/

相关文章:

c++ - std::future::wait_for 虚假唤醒?

c++ - 为什么 std::ostream 的构造函数受到保护?

c++ - C++ 方法 ostream::exceptions(iostate state) 的行为应该是什么?

c++ - 非常奇怪的写入二进制文件的行为

c++ - 如何将 C++ 函数的输入传递给主函数

c++ - Windows Mobile 在 `new` 失败时返回 0

c# - DLL 不能在 C# 中运行

c++ - 通过将两个短裤组合成一个整数来同时对两个短裤进行操作

c++ - Consexpr 与宏

c++ - 使用模板化可变模板参数作为专用参数