c++ - 如果我不允许分配右值来引用为什么下面的代码片段有效,这在内部是如何工作的?

标签 c++ syntax

我正在研究模板和 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),我不是在这两种情况下都做同样的事情,将右值分配给引用吗?

最佳答案

if I am not allowed to assign rvalues to reference why does the following snippet work

因为你错了。您可以使用右值将左值引用初始化为 const。

how does this work?

创建一个临时对象并将引用绑定(bind)到该临时对象。

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

How come doing this is illegal:

int& r = 3;

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

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

关于c++ - 如果我不允许分配右值来引用为什么下面的代码片段有效,这在内部是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55559563/

相关文章:

c++ - 如何打印以逗号分隔的元素列表?

c++ - 如何使用 C++ 查找 WAV 文件的最高音量级别

c++ - 从缓冲区输入的位

java - 带大括号的语句无效

javascript - 为什么在语法更简洁的情况下使用 javascript 回调?

c++ - 通过确定系数找到两个 vector 的关系

C++ std::map::iterator 什么也没找到,但下标运算符返回对映射值的引用?

c++ - 错误 : request for member (maybe you meant to use '->' ? ) 已经使用 '->'

c# - 在 C# 中什么时候使用没有语句的作用域?

javascript - 为什么 yield 被归类为运算符而不是语句?