我可以在 C++ 中安全地从 std::stringstream 中得到一个 c_str 吗?
Can I safely get a c_str out of std::stringstream in c++?
我正在使用一个 C 函数,该函数接受一个字符串(即指向以空字符结尾的 char 数组的指针)并在内部对其进行处理。它 不会 ,但是,在函数 returns.
之后保留对字符串的引用
我想给它传递一些格式化的输入,所以我使用了 std::stringstream
。为了让我的代码更简洁——并且因为这种模式在整个代码库中重复出现,我想简单地传递 ss.str().c_str()
.
对我来说这似乎很可怕,因为我正在临时 ss.str()
上调用一个方法,但我认为这没关系,因为生命周期延长了。即,标准说:
A temporary bound to a reference parameter in a function call (5.2.2) persists until the completion of the full expression containing the call [...] In all these cases, the temporaries created during the evaluation of the expression initializing the reference, except the temporary to which the reference is bound, are destroyed at the end of the full-expression in which they are created and in the reverse order of the completion of their construction.
(强调我的)
因此,我希望我的价值观会一直存在,直到 C API 调用结束。我错了吗?这样做安全吗?从概念上讲,我的代码如下所示:
void g(int x, int y) {
std::stringstream ss;
ss << "(" << x << ", " << y << ")";
puts(ss.str().c_str());
}
是的,很好,ss.str().c_str()
在使用 C 风格的 API 时经常出现。
非正式地说,从 ss.str()
返回的匿名临时 std::string
在 puts()
函数调用后仍然存在。这意味着 c_str()
返回的 const char*
指针在 puts()
.
期间仍然有效
你不能做的是:
const char* ub = ss.str().c_str();
puts(ub);
因为指针 ub
悬空。
我正在使用一个 C 函数,该函数接受一个字符串(即指向以空字符结尾的 char 数组的指针)并在内部对其进行处理。它 不会 ,但是,在函数 returns.
之后保留对字符串的引用我想给它传递一些格式化的输入,所以我使用了 std::stringstream
。为了让我的代码更简洁——并且因为这种模式在整个代码库中重复出现,我想简单地传递 ss.str().c_str()
.
对我来说这似乎很可怕,因为我正在临时 ss.str()
上调用一个方法,但我认为这没关系,因为生命周期延长了。即,标准说:
A temporary bound to a reference parameter in a function call (5.2.2) persists until the completion of the full expression containing the call [...] In all these cases, the temporaries created during the evaluation of the expression initializing the reference, except the temporary to which the reference is bound, are destroyed at the end of the full-expression in which they are created and in the reverse order of the completion of their construction.
(强调我的)
因此,我希望我的价值观会一直存在,直到 C API 调用结束。我错了吗?这样做安全吗?从概念上讲,我的代码如下所示:
void g(int x, int y) {
std::stringstream ss;
ss << "(" << x << ", " << y << ")";
puts(ss.str().c_str());
}
是的,很好,ss.str().c_str()
在使用 C 风格的 API 时经常出现。
非正式地说,从 ss.str()
返回的匿名临时 std::string
在 puts()
函数调用后仍然存在。这意味着 c_str()
返回的 const char*
指针在 puts()
.
你不能做的是:
const char* ub = ss.str().c_str();
puts(ub);
因为指针 ub
悬空。