我测试了它。
我可以猜测,operator<<
不能结合临时到非const引用,所以任何外部定义的操作者< <功能不会对富临时工作,但任何类成员的将因此如果ostream
或ostringstream
具有任何内部他们将会工作的operator<<
成员。
因此,它可能是一个指针的重载是一个成员函数,而特殊的const char *是外部声明的。
对于更专业的过载,非临时可以绑定到非const引用。
如果你真的需要这一点,你可以测试一个包装
class Foo :
{
mutable std::ostringstream oss;
public:
~Foo()
{
std::cout << oss.str();
}
template<typename T>
std::ostream&
operator<<(const T& t) const
{
return oss << t;
}
};
和工程解决方法。第一个运算符< <将返回基础流。
我想这太,但它coredumped:
class Foo : std::ostringstream
{
Foo & nonconstref;
public:
Foo() : nonconstref(*this) {}
~Foo()
{
std::cout << str();
}
template<typename T>
std::ostream&
operator<<(const T& t) const
{
return nonconstref << t;
}
};
这也适用于:
class Foo : public std::ostringstream
{
public:
Foo() {}
~Foo()
{
std::cout << str();
}
Foo& ncref()
{
return *this;
}
};
int main()
{
Foo foo;
foo << "Test1" << std::endl;
Foo().ncref() << "Test2" << std::endl;
}
编译器?平台? – CashCow 2011-03-03 11:33:18
我不认为问题出在临时的一生。从汇编程序中,我可以看到它正在通过'char const *'takes操作符选择'std :: basic_ostream> :: operator <<(void const *)'。我无法解释它。我不明白为什么'void const *'接受运算符会比'char const *'接受运算符更好地匹配。 MSVC 2010打印这两个字符串,但我想这可能是因为一些扩展,而不是更符合。 –
wilx
2011-03-03 12:16:09
@wilx我已经回答了为什么可能发生这种情况:外部重载(不是类成员)和内部(类成员)确实会产生真正的差异。 – CashCow 2011-03-03 12:20:34