模糊的 C++ 运算符重载
Obscure C++ operator overloading
我有以下代码:
#include <iostream>
using namespace std;
ostream& f(ostream& os) {
return os << "hi";
}
int main() {
cout << "hello " << f << endl;
return 0;
}
不知何故这有效 - 输出是 "hello hi"。编译器如何解释它?我不明白如何将函数插入到流中。
std::ostream::operator<<
有一个重载,它接受一个函数作为参数;该重载的主体是调用给定的函数。
这正是 endl
实际上的工作方式。 endl
实际上是一个类似于:
的函数
ostream &endl(ostream &os)
{
os << '\n';
os.flush();
return os;
}
std::ostream
有一个 operator<<
重载,它接收一个指向带有签名的函数的指针,例如您编写的签名 (number 11 in this list):
basic_ostream& operator<<(
std::basic_ostream<CharT,Traits>& (*func)(std::basic_ostream<CharT,Traits>&) );
它只是调用给定函数并将其自身作为参数传递。这个重载(以及其他几个类似的重载)允许您实现 流操纵器 ,即您使用 <<
在流中输出的内容并更改从那里流。例如,我们版本的(错误地)无处不在的 std::endl
可能会实现为
std::ostream &myendl(std::ostream &s) {
s<<'\n';
s.flush();
return s;
}
然后可以完全用作 "regular" std::endl
:
std::cout<<"Hello, World!"<<myendl;
(实际的实现是模板化的,而且有点复杂,因为它必须在宽流下工作,但你明白了)
我有以下代码:
#include <iostream>
using namespace std;
ostream& f(ostream& os) {
return os << "hi";
}
int main() {
cout << "hello " << f << endl;
return 0;
}
不知何故这有效 - 输出是 "hello hi"。编译器如何解释它?我不明白如何将函数插入到流中。
std::ostream::operator<<
有一个重载,它接受一个函数作为参数;该重载的主体是调用给定的函数。
这正是 endl
实际上的工作方式。 endl
实际上是一个类似于:
ostream &endl(ostream &os)
{
os << '\n';
os.flush();
return os;
}
std::ostream
有一个 operator<<
重载,它接收一个指向带有签名的函数的指针,例如您编写的签名 (number 11 in this list):
basic_ostream& operator<<(
std::basic_ostream<CharT,Traits>& (*func)(std::basic_ostream<CharT,Traits>&) );
它只是调用给定函数并将其自身作为参数传递。这个重载(以及其他几个类似的重载)允许您实现 流操纵器 ,即您使用 <<
在流中输出的内容并更改从那里流。例如,我们版本的(错误地)无处不在的 std::endl
可能会实现为
std::ostream &myendl(std::ostream &s) {
s<<'\n';
s.flush();
return s;
}
然后可以完全用作 "regular" std::endl
:
std::cout<<"Hello, World!"<<myendl;
(实际的实现是模板化的,而且有点复杂,因为它必须在宽流下工作,但你明白了)