【发布时间】:2021-04-10 11:01:47
【问题描述】:
我正在使用一个 C 函数,它接受一个字符串(即指向一个以空字符结尾的 char 数组的指针)并在内部处理它。但是,它不在函数返回后保留对字符串的引用。
我想向它传递一些格式化的输入,所以我使用std::stringstream。为了让我的代码更简洁——并且因为这种模式在整个代码库中重复出现,我想简单地传递ss.str().c_str()。
对我来说,这似乎很可怕,因为我在临时 ss.str() 上调用了一个方法,但我认为这可以延长寿命。即,标准说:
在函数调用 (5.2.2) 中临时绑定到引用参数会一直存在,直到包含调用的完整表达式完成为止 [...] 在所有这些情况下,在初始化表达式的评估期间创建的临时对象除了引用绑定到的临时引用之外,该引用在在创建它们的完整表达式的末尾被销毁,并以它们构造完成的相反顺序被销毁。
(强调我的)
因此,我希望我的价值观在 C API 调用结束之前一直存在。我弄错了吗?这样做安全吗?从概念上讲,我的代码如下所示:
void g(int x, int y) {
std::stringstream ss;
ss << "(" << x << ", " << y << ")";
puts(ss.str().c_str());
}
【问题讨论】:
-
“完整表达式的结尾”是
;后面的puts这里。
标签: c++ reference pass-by-reference lifetime