【问题标题】:Passing a temporary object to std::cout将临时对象传递给 std::cout
【发布时间】:2012-12-27 03:34:35
【问题描述】:

我有一段非常简单的测试代码:

std::string a = "A"
std::string b = "B"

std::cout << a + b << std::endl;

虽然它在 GNU g++ 中工作,但我担心将临时 a + b 传递给 std::cout 是否可移植,例如,std::cout 是否保证接收正确的内存?

非常感谢!

【问题讨论】:

  • @Mankarse,是的,确实如此。我会删除它。

标签: c++ temporary


【解决方案1】:

很安全。在cout 处理之前,临时文件不会被销毁。

更多详情请见When are temporaries created as part of a function call destroyed?

【讨论】:

  • 耶,又短又甜。谢谢!
【解决方案2】:

是的——a+b 创建一个临时的std::string 对象,该对象被传递给std::cout。在创建它的完整表达式结束时,该临时对象将被销毁,但之前不会,因此它将一直有效,直到表达式结束。

除此之外,临时对象与几乎任何其他std::string 对象几乎相同,因此它是临时对象这一事实与std::cout 如何处理它无关。

【讨论】:

  • 真的很好奇这个。:你说:“那个临时对象被销毁”。那应该是:“那个临时对象然后可以被销毁”?我对这个标准不是很清楚(因此我的问题),但我的印象是,在离开它的操作范围之前,对象不会必须被销毁,但保证在它参与的表达式完成之前不会被破坏。只有在当前范围内处理可预测的破坏时,它才真正重要,但有时这很重要。
  • @WhozCraig:我现在没有可以方便检查的标准副本,但是如果有记忆,它应该在评估任何后续表达式之前被销毁。
  • 我的兴趣达到了顶峰,所以我查了一下,你没记错。 C++11 12.2.p3 指定“临时对象被销毁作为评估完整表达式 (1.9) 的最后一步,该完整表达式 (1.9) 包含创建它们的点。即使评估以抛出例外。”然后它继续指定对象生命周期的扩展(数组构造和破坏(p4)和引用(p5))。感谢您花时间为我指明方向。
猜你喜欢
  • 2013-07-10
  • 1970-01-01
  • 2014-07-06
  • 1970-01-01
  • 2019-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-07
相关资源
最近更新 更多