for流operator<<
返回std::ostream &
没有str()
成员函数。您需要使用演员表。
static_cast<std::ostringstream&>(std::ostringstream() << etc).str()
使用临时流时 C++03 和 C++11 的区别!
C++03
但是请注意(在 C++03 中)它std::ostringstream()
创建了一个临时对象,这意味着不能首先调用的非成员重载,因为它们都接受第一个参数,因为它们不能绑定到临时对象。临时对象将只能调用成员函数。operator<<
<<
std::ostream&
这意味着,以下内容将为您提供address而不是string:
static_cast<std::ostringstream&>(std::ostringstream() << "XYZ").str()
因为char const*
作为参数的重载是一个非成员函数,不能被调用,所以上面的代码最终调用了void const*
作为参数的成员函数,因此"XYZ"
被隐式转换为void const*
,打印字符串文字的地址。
一旦临时调用成员函数,剩余的链接<<
可能会调用非成员重载,因为成员函数返回std::ostream&
现在可以绑定到非成员重载的第一个参数operator<<
。所以下面的代码将打印一个地址(而不是"XYZ"
),然后是字符串"ABC"
:
static_cast<std::ostringstream&>(std::ostringstream() << "XYZ" << "ABC").str()
在线演示:
C++11
在 C++11 中,此问题已通过添加一个非成员函数 (27.7.3.9) 得到解决,该函数将第一个参数作为右值引用,然后将调用转发给适当的函数,无论是成员还是非成员。所以它打印XYZ
后跟ABC
:
- GCC 输出
-std=c++11
- 铿锵 输出
-std=c++11