相关疑难解决方法(0)

延长临时寿命的理由是什么?

在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++ language-design

19
推荐指数
2
解决办法
462
查看次数

const引用的文字初始化

以下代码如何在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++入门.

c++ variables initialization reference

18
推荐指数
2
解决办法
4848
查看次数