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