繁体   English   中英

C ++ stringstream inline

[英]C++ stringstream inline

我想用std::stringstream创建格式化的字符串,但使用内嵌类,所以我没有stringstream局部变量飞来飞去。 我的意思是:

#include <iostream>
#include <ostream>
#include <string>
#include <sstream>

int main(int argc, char* argv[])
{
    std::string test = ((std::ostringstream&)
         (std::ostringstream("") << "This is a test: " << 50.1 << "abc")
         ).str();
    std::cout << test << std::endl;
    return 0;
}

这在GCC中编译很好,但输出如下:

“0x401d0a50.1abc”

所以似乎stringstream将第一个字符串视为指针并输出地址。 随后的operator<<的工作正常。

我该如何解决? 谢谢!

原因是<<运算符是void const*的成员,但是一个自由函数将std::ostream&作为char const*左手参数。 你的std::ostringstream( "" )是一个临时的:你可以在其上调用成员函数(甚至是非const成员函数),但是临时函数不能用于初始化全局函数的非const引用。

编辑:

两点:首先,正如已经指出的那样,如果指定-std=c++11 ,g ++会做你想要的。 正如TC指出的那样,这在§27.7.3.9中规定,它为所有<<提供模板重载,并为std::istream参数提供rvalue引用。 第二,经典的工作是启动表达式std::ostringstream( "" ).flush() <<... flush是一个成员函数(因此可以在临时调用)返回一个std::ostream& (所以其他所有链都很好); 它对std::ostringstream也没有任何作用。

找到了。 C ++ 11标准特例rvalue流带有额外的模板operator<< overload。 §27.7.3.9标准:

Rvalue流插入[ostream.rvalue]

 template <class charT, class traits, class T> basic_ostream<charT, traits>& operator<<(basic_ostream<charT, traits>&& os, const T& x); 

效果: os << x

返回: os

它显然是比成员operator<<更好的匹配,它采用const void * ,因此在C ++ 11模式下通过重载决策选择。 在C ++ 98模式下,这个重载不存在(因为没有右值引用),唯一可行的重载是成员operator<< (因为正如James Kanze在他的回答中解释的那样,临时不能绑定到free const operator<<中的非const左值引用,带有一个const char *重载。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM