为什么第二个语句打印十六进制值

时间:2014-02-20 12:43:57

标签: c++

使用流操作符的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

2 个答案:

答案 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&,不能绑定到右值。