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