C++ 将常量引用传递给C+中安全的临时字符串对象+;?

C++ 将常量引用传递给C+中安全的临时字符串对象+;?,c++,C++,考虑函数f void f(const std::string& s) { ... } 使用固定字符串调用f是否安全,如下所示: f("abc"); 如果在函数返回后不使用它,它是安全的 因此,使用它初始化另一个字符串对象(在函数返回之前)也是安全的,即使该字符串对象的寿命更长(并且使用时间更长)。如果在函数返回后不使用它,也是安全的 因此,使用它来初始化另一个字符串对象(在函数返回之前)也是安全的,即使该字符串对象的寿命更长(并且使用时间更长)。从“abc”隐式构造的std:

考虑函数f

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。