如果我不被允许分配rvalues来引用为什么以下代码片段工作,这在内部如何工作?

问题描述 投票:0回答:1

我正在玩模板和c ++语法,我注意到当函数定义如下时,你只需通过调用add(2,3)就能通过引用传递:

#include <iostream>
using namespace std;


auto add(const int& lhs, const int& rhs)
{
    return lhs + rhs;
}

int main()
{
    cout << add(2, 3) << '\n';
    getchar();
    return 0;
}

怎么做这个是非法的:

int& r = 3;

但是我可以毫无问题地调用add(2,3),在这两种情况下我都不是这样做,为引用分配一个rvalue吗?

c++ syntax
1个回答
3
投票

如果我不被允许分配rvalues来引用为什么以下代码段工作

因为你错了。您可以使用rvalues初始化对const的左值引用。

这是如何运作的?

创建临时对象,并将引用绑定到该临时对象。

此外,临时对象的生命周期通常直到完整表达式结束,但是当绑定到引用时,该生命周期将延长到引用的生命周期。在这种特殊情况下,引用参数的生命周期不比函数调用的完整表达式长,因此该规则并不重要。

怎么做这个是非法的:

int& r = 3;

因为r不是const的引用。它是对非​​const的引用。

如果您确实更改了引用的常量,那么这将是格式良好的,并且上面的段落中的规则将变得相关。

© www.soinside.com 2019 - 2024. All rights reserved.