我偶然发现了我最初无法解释的怪异行为(请参阅ideone:
#include <iostream>
#include <sstream>
#include <string>
int main() {
std::cout << "Reference : "
<< (void const*)"some data"
<< "\n";
std::ostringstream s;
s << "some data";
std::cout << "Regular Syntax: " << s.str() << "\n";
std::ostringstream s2;
std::cout << "Semi inline : "
<< static_cast<std::ostringstream&>(s2 << "some data").str()
<< "\n";
std::cout << "Inline : "
<< dynamic_cast<std::ostringstream&>(
std::ostringstream() << "some data"
).str()
<< "\n";
}
给出输出:
Reference : 0x804a03d
Regular Syntax: some data
Semi inline : some data
Inline : 0x804a03d
令人惊讶的是,在最后一个演员表中,我们有地址,而不是内容!
为什么会这样?
expression std::ostringstream()
创建一个临时函数,并且以operator<<
作为参数的const char*
是一个自由函数,但是该自由函数不能在一个临时函数上调用,因为该函数的第一个参数的类型为[ C0],无法绑定到临时对象。
临时不能绑定到对非const形式参数的引用。
首先,最简单的解决方案是获取编译器考虑的可能重载的列表,例如os
this: