C++ 将常量引用传递给C+中安全的临时字符串对象+;?
考虑函数fC++ 将常量引用传递给C+中安全的临时字符串对象+;?,c++,C++,考虑函数f void f(const std::string& s) { ... } 使用固定字符串调用f是否安全,如下所示: f("abc"); 如果在函数返回后不使用它,它是安全的 因此,使用它初始化另一个字符串对象(在函数返回之前)也是安全的,即使该字符串对象的寿命更长(并且使用时间更长)。如果在函数返回后不使用它,也是安全的 因此,使用它来初始化另一个字符串对象(在函数返回之前)也是安全的,即使该字符串对象的寿命更长(并且使用时间更长)。从“abc”隐式构造的std:
void f(const std::string& s) {
...
}
使用固定字符串调用f是否安全,如下所示:
f("abc");
如果在函数返回后不使用它,它是安全的
因此,使用它初始化另一个字符串对象(在函数返回之前)也是安全的,即使该字符串对象的寿命更长(并且使用时间更长)。如果在函数返回后不使用它,也是安全的
因此,使用它来初始化另一个字符串对象(在函数返回之前)也是安全的,即使该字符串对象的寿命更长(并且使用时间更长)。从
“abc”
隐式构造的std::string
的生命周期直到对f()
的调用结束。只要在f()
结束后不将该引用保留在其他地方,它是完全安全的
std::string const *pstr;
void f(std::string const &s)
{
s.length(); // safe. s has an instance backing
// it for the lifetime of this function.
pstr = &s; // still technically safe, but only if you don't
// dereference pstr after this function completes.
}
f("abc");
pstr->length(); // undefined behavior, the instance
// pstr pointed to no longer exists.
从
“abc”
隐式构造的std::string
的生存期直到调用f()
结束。只要在f()
结束后不将该引用保留在其他地方,它是完全安全的
std::string const *pstr;
void f(std::string const &s)
{
s.length(); // safe. s has an instance backing
// it for the lifetime of this function.
pstr = &s; // still technically safe, but only if you don't
// dereference pstr after this function completes.
}
f("abc");
pstr->length(); // undefined behavior, the instance
// pstr pointed to no longer exists.
假设您没有在某个地方存储指向参数的引用或指针,并且希望它在从函数返回后仍然存在,那么应该可以:调用函数时,将创建一个临时的
std::string
,该字符串在函数执行时一直存在。假设您没有将指向该参数的引用或指针存储在某个位置,并且希望在从函数返回后该参数仍然存在,则应该可以:调用函数时,将创建一个临时的std::string
,该字符串在函数执行时存在。它既不安全也不安全。它可能做你想做的事,也可能不做你想做的事,这取决于你想做的事。@PeteBecker什么样的事情可能是危险的?我不会试图改变s。它既不安全也不安全。它可能做你想做的事,也可能不做你想做的事,这取决于你想做的事。@PeteBecker什么样的事情可能是危险的?我不想改变s。