void foo(const std::string& s = "abc") {
// ...
}
// ...
int main() {
// ...
foo();
// ...
}
Run Code Online (Sandbox Code Playgroud)
将s在foo被晃来晃去?我认为因为std::string将从默认值构造"abc",然后这将是一个const引用做死临时.
我对吗?
s不会晃来晃去的foo,但是临时住了整个晚上foo。需要理解以下几点以了解为什么会发生这种情况:
当您在函数上声明默认参数时,默认参数将插入到调用站点。您编写的代码的行为与以下代码相同:
void foo(const std::string& s) {
// ...
}
// ...
int main() {
// ...
foo("abc");
// ...
}
Run Code Online (Sandbox Code Playgroud)
因此,std::string临时文件是在呼叫站点上创建的。
当临时文件std::string绑定到时const std::string& s,临时文件会延长寿命。它会一直持续到完整表达式的末尾,即分号位于的末尾foo("abc");。
放在一起,我们可以看到它s不会悬空,因为它指向一个临时字符串,该字符串的生存时间至少与foo执行时间一样长。
| 归档时间: |
|
| 查看次数: |
290 次 |
| 最近记录: |