- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
当我运行以下程序时
#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/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
我已更改 my.cnf。并检查sql_mode使用下面的命令 select @@global.sql_mode; 它说, 我也尝试过 set global sql_mode=''; SET sql_m
首先,我有一个结构,它有一个值和一个默认值 struct S { int a = 1; }; 当 gcc 和 clang 都是 non-const/non-constexpr 时,可以默认构造
我是一名优秀的程序员,十分优秀!