将一个const引用参数初始化为默认参数会导致悬空引用吗?

vla*_*don 7 c++ lifetime

void foo(const std::string& s = "abc") {
    // ...
}

// ...

int main() {
    // ...
    foo();
    // ...
}
Run Code Online (Sandbox Code Playgroud)

sfoo被晃来晃去?我认为因为std::string将从默认值构造"abc",然后这将是一个const引用做死临时.

我对吗?

Red*_*edX 5

的构造函数std::string(const char*)将用于构造一个临时函数,该临时函数将在函数的整个生命周期中均有效。

这样就不会有问题。


Jus*_*tin 5

s不会晃来晃去的foo,但是临时住了整个晚上foo。需要理解以下几点以了解为什么会发生这种情况:

  1. 当您在函数上声明默认参数时,默认参数将插入到调用站点。您编写的代码的行为与以下代码相同:

    void foo(const std::string& s) {
        // ...
    }
    
    // ...
    
    int main() {
        // ...
        foo("abc");
        // ...
    }
    
    Run Code Online (Sandbox Code Playgroud)

    因此,std::string临时文件是在呼叫站点上创建的。

  2. 当临时文件std::string绑定到时const std::string& s,临时文件会延长寿命。它会一直持续到完整表达式的末尾,即分号位于的末尾foo("abc");

放在一起,我们可以看到它s不会悬空,因为它指向一个临时字符串,该字符串的生存时间至少与foo执行时间一样长。