将const引用传递给C ++中的临时字符串对象是否安全?

时间:2012-12-11 22:40:05

标签: c++

考虑函数f

void f(const std::string& s) {
    ...
}

使用如下所示的固定字符串调用f是否安全:

f("abc");

3 个答案:

答案 0 :(得分:8)

std::string隐式构建的"abc"的生命周期直到对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.

答案 1 :(得分:2)

假设你没有在某个地方存储一个引用或指针,并希望它从函数返回时仍然存在,它应该没问题:当调用该函数时,临时std::string在函数执行的时候创建它。

答案 2 :(得分:0)

如果在函数返回后不使用它,那将是安全的。

正因为如此,使用它来初始化另一个字符串对象(在函数返回之前)也是安全的,即使这个字符串对象的寿命更长(并且使用的时间更长)。