【发布时间】:2020-02-28 00:09:39
【问题描述】:
是否可以通过 const 引用返回默认参数的值,如下例所示:
https://coliru.stacked-crooked.com/a/ff76e060a007723b
#include <string>
const std::string& foo(const std::string& s = std::string(""))
{
return s;
}
int main()
{
const std::string& s1 = foo();
std::string s2 = foo();
const std::string& s3 = foo("s");
std::string s4 = foo("s");
}
【问题讨论】:
-
简单测试:用你自己的类替换
std::string,这样你就可以跟踪构造和破坏。 -
@user4581301 如果序列是正确的,它并不能证明构造是好的。
-
@user4581301 “当我尝试它时它似乎工作”是关于未定义行为的绝对最糟糕的事情
-
应该指出,这个问题的措辞是一个误导性的花絮。您不是通过 const 引用返回默认参数的值,而是将 const 引用返回到 const 引用(... 到默认参数)。
-
@HerrJoebob 100% 同意该声明,但不同意您使用它的上下文。我阅读它的方式解决了“对象的生命周期何时结束?”弄清楚何时调用析构函数是一个很好的方法。对于 Automatic 变量,应该按时调用析构函数,否则您会遇到大问题。
标签: c++ language-lawyer object-lifetime default-arguments reference-binding