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::ostream
char
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)
等等.
一个原因是遵循一般的 C++ 建议,即优先使用非成员非友元函数而不是成员函数。这是 Scott Meyer 的Effective C++ 中的第23 项。这在stackoverflow 中进行了讨论。
归档时间: |
|
查看次数: |
957 次 |
最近记录: |