使用流操作符的c ++代码失败。我无法弄清楚为什么第二个印刷品“DEF”无效::
#include <iostream>
#include <sstream>
struct logger :public std::ostringstream {};
struct logger_flush {};
logger_flush endl;
std::ostream& operator << (std::ostream& os, const logger_flush& lf) {
logger& oss = dynamic_cast<logger&>(os);
std::cout << oss.str() << std::endl;
}
int main()
{
logger() << 100 << "ABC?" << endl;
logger() << "DEF" << endl;
}
输出是:
100ABC?
0x40168d
答案 0 :(得分:3)
logger()
是一个右值,这就是你想要的::operator<<(logger(), "DEF")
调用不起作用的原因:operator<<
的重载采用左值引用参数,而rvalues不能绑定到非const左值参考。
但是,rvalue类允许调用方法,因此重载logger().operator<<((void*)"DEF")
可用,并且它成为logger() << "DEF"
的最佳匹配。
适用于logger() << 100 << "ABC?" << endl;
,因为logger() << 100
返回左值引用,而左值引用则是::operator<<
的有效参数。
答案 1 :(得分:3)
这应该适用于C ++ 11,因为ostream& operator<<(ostream&& os, const T& value)
重载,允许您将流用作rvalues。
在C ++ 03中,它会打印一个地址,因为void*
重载是一个成员(可以在rvalues上调用),而char const*
重载是非成员,第一个参数是ostream&
,不能绑定到右值。