临时std :: ostringstream的奇数(?)行为

时间:2011-05-11 12:05:28

标签: c++

我在查看这个问题std::ostringstream时正在弄乱stringbuilder(),并注意到Nawaz的std::ostringstream包装并认为,这应该与std::cout << (std::ostringstream("select * from foo limit") << max_limit).str() << std::endl; 一起使用

所以我的第一次尝试如下:

operator<<

现在这显然无法编译(正确),因为std::ostream的结果是str() - 它没有成员const。所以我认为演员应该做的伎俩,特别是对std::cout << static_cast<std::ostringstream const&>(std::ostringstream("select * from foo limit") << max_limit).str() << std::endl; 引用的强制转换(也可以使用强制转换为普通引用),所以第二次尝试:

stringbuilder

现在这个编译很好并且运行,但输出是,而不是我期望的。

  

10选*来自foo limit

现在 - 这是问题,我在某处调用了一些未定义的行为 - 如果是这样的话?这与Nawaz所采用的方法有何不同(我想除了他的算子的结果是std::ostream本身而不是max_limit)。

编辑:这是sprintf in c++?

编辑:oops - 忘记指定,int是{{1}}。

3 个答案:

答案 0 :(得分:4)

您需要将流的位置移动到ostringstream使用的内部缓冲区的末尾:

  std::ostringstream out("select * from foo limit ", std::ios_base::app);
  out << max_limit;
  std::cout << out.str () << std::endl;

请参阅ostringstream构造函数上的documentation

答案 1 :(得分:2)

什么是maxLimit

某些ostream operator<<重载是免费功能,例如:

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

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

因此,您可能偶然使用非首选过载;可能类似于char const*的重载。很难说不知道maxLimit是什么。

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

您还试图将std::cout发送到std::cout,这显然不是您打算做的。

更新 Vijay想通了。

std::cout << static_cast<std::ostringstream const&>(
   std::ostringstream("select * from foo limit", std::ios_base::app) << max_limit
).str() << std::endl

但是,上述内容仍然值得铭记。

答案 2 :(得分:0)

您也可以简单地将flush用作:

static_cast<std::ostringstream const&>(std::ostringstream().flush() << "select * from foo limit " << max_limit).str() << std::endl;

但是代码不一样。它使用默认构造函数。

作为旁注:这里dynamic_cast更合适吗?

演示:http://www.ideone.com/06xNS