在C++中,临时值的生命周期可以通过将其绑定到引用来扩展:
Foo make_foo();
{
Foo const & r1 = make_foo();
Foo && r2 = make_foo();
// ...
} // both objects are destroyed here
Run Code Online (Sandbox Code Playgroud)
为什么允许这样做?这解决了什么问题?
我在设计和演变中找不到对此的解释(例如6.3.2:临时工作时间).我也找不到任何关于此的问题(这个问题最接近).
此功能有点不直观,并且具有微妙的故障模式.例如:
Foo const & id(Foo const & x) { return x; } // looks like a fine function...
Foo const & r3 = id(make_foo()); // ... but causes a terrible error!
Run Code Online (Sandbox Code Playgroud)
为什么某些东西可以如此容易和默默地滥用语言的一部分?
更新:这一点可能非常微妙,需要作出一些澄清:我不反对使用"引用绑定临时"的规则.这一切都很好,并且允许我们在绑定引用时使用隐式转换.我要问的是为什么临时的生命受到影响.为了扮演魔鬼的拥护者,我可以声称现有的"终身直到完全表达结束"的规则已经涵盖了使用临时参数调用函数的常见用例.
以下代码如何在C++中工作?这合乎逻辑吗?
const int &ref = 9;
const int &another_ref = ref + 6;
Run Code Online (Sandbox Code Playgroud)
为什么当非const引用不允许C++时,C++允许对const引用进行文字初始化?例如:
const int days_of_week = 7;
int &dof = days_of_week; //error: non const reference to a const object
Run Code Online (Sandbox Code Playgroud)
这可以通过以下事实来解释:非const引用可用于更改它所引用的变量的值.因此,C++不允许对const变量进行非const引用.
这可能是一个可能的解释吗?C++不允许:
int &ref = 7;
Run Code Online (Sandbox Code Playgroud)
因为这不符合逻辑,但是:
const int &ref = 7;
Run Code Online (Sandbox Code Playgroud)
几乎相当于:
const int val = 7;
Run Code Online (Sandbox Code Playgroud)
因此,const变量允许进行文字初始化.
PS:我正在研究Lippman的C++入门.