std :: ostringstream的问题

时间:2010-03-29 16:00:24

标签: c++

我试图通过将代码#1更改为代码#2来使代​​码#1更简洁,但它不能按预期工作。任何人都可以告诉我为什么它不起作用?谢谢。

代码#1

double x = 8.9, y = 3.4, z = -4.5;
std::ostringstream q0;
q0 << "(" << x << "," << y << "," << z << ")";
std::string s = q0.str();


代码#2

double x = 8.9, y = 3.4, z = -4.5;
std::string s = static_cast<std::ostringstream &>(
  std::ostringstream() << "(" << x << "," << y << "," << z << ")").str();


6 个答案:

答案 0 :(得分:7)

我已经复制了你的垃圾。我唯一能想到的是你的静态演员是无效的。这对我来说似乎很奇怪,但这是我能想到的唯一可能发生的事情。可能是op&lt;&lt;返回不能转换为ostringstream的ostringstream以外的东西......就像某种类型的引用流一样。实际上,在为变量分配引用并查看调​​试器中的类型时,对于ostringstream来说看起来很奇怪。

无论如何,没有理由“简洁”。实际上,对于需要阅读代码的其他开发人员而言,简洁通常非常烦人。如果你想成为“简洁”,那就把你的东西放在一个函数中,该函数返回一个字符串并将其命名为有用的东西。

编辑:

实际上,我想我可能会有更好的答案。您将非const引用绑定到临时并在其上调用函数。保证const引用继续存在直到“语句”结束(现在忘记技术术语但它已经关闭)。非const引用没有此保证。因此,当您在此非const引用上调用str()时,我认为您正在引发未定义的行为,因为编译器可以自由删除它引用的临时值。

答案 1 :(得分:3)

您可能希望使用此answer中提供的代码。

答案 2 :(得分:3)

我刚才问过a similar question。答案解释了为什么你所做的不起作用(你可能遇到过编译时错误或像我一样打印字符串作为十六进制地址),以及如何解决它(Johannes Schaub使用{发布了一个非常好的解决方法{1}})。

答案 3 :(得分:1)

如果您有权访问boost format library,则可以将以下内容视为“简洁”。

cout << boost::format("writing %1%,  x=%2% : %3%-th try") % "toto" % 40.23 % 50;

答案 4 :(得分:1)

您已经解决了上面“为什么”已经解决的问题。

一个快速的建议是,你总是可以用ostringstream()替换ostringstream().flush()来使你的事情发挥作用。这使得结果符合ref-to-non-const绑定。

答案 5 :(得分:0)

部分ostream operator<<重载 - 特别是std::stringchar const*的重载是免费功能,例如:

ostream& operator<<(ostream& os, T const&);

如果流是临时的(在您的情况下是它),则它无法绑定到ref-to-non-const,并且无法选择重载。

因此,您偶然会意外地使用非首选过载;在这种情况下,void const*的重载。这就是你看到指针内容(它不是“垃圾”)的原因。

尝试在一行上进行此序列化时,这是一个限制,您无法绕过它。