我有以下代码
#include <iostream>
#include <sstream>
class oTraceStream : public std::ostringstream
{
public :
oTraceStream(const int from, const unsigned int level)
: m_from(from)
, m_level(level)
{
}
virtual ~oTraceStream(void)
{
std::cout << str();
}
private :
// unused for this sample
int m_from;
unsigned int m_level;
};
int main(int argc, char* argv[])
{
oTraceStream(0,0) << "1st part " << " 2nd part" << std::endl;
{
oTraceStream tmp(0,0);
tmp << "1st part " << " 2nd part" << std::endl;
}
return 0;
}
使用 MS Visual 6.0 或旧的 gcc(2.x),2 个输出是相同的。
1st part 2nd part
1st part 2nd part
使用 MS Visual 2008 或最近的 gcc (4.x),第一行的第一个字符串显示为指针
0x80493ec 2nd part
1st part 2nd part
有人能解释一下为什么最近的编译器第一行是使用 ostream::operator<<(const void* p) 而不是 ostream::operator<<(const char *) 显示的吗?
最佳答案
void const *
overload 是 std::ostream
的成员,而 char const *
overload 是非成员。临时oTraceStream(0,0)
对象不会绑定(bind)到非成员使用的非常量引用 operator <<
, 但它将绑定(bind)到隐式 this
成员使用的参数。
C++11 使行为回到您的期望,因为它添加了一个 operator <<
它采用右值(例如临时对象子表达式)并将其切换为左值(例如命名对象子表达式)。
关于C++ 运算符 << (void*),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24161979/