Rvalue和Lvalue引用

4
我有一个名为printInt的函数,如下所示。
void printInt(const int& a)
{
    cout<<a<<endl;
}

当我使用以下参数调用像函数时,例如:
int a=5;
printInt(a);
printInt(5);

它工作得非常完美。 但是当我更改函数定义为

void printInt(int& a)
{
    cout<<a<<endl;
}

这会导致调用printInt(5)时出错。现在我的问题是为什么const int&既是左值引用又是右值引用,而int&只是左值引用。据我所知,int&&是右值引用。那么一个单独的&如何引用一个右值引用?
总结一下我的问题:
  1. Lvalue reference parameter

    void printInt(int& a)
    {
        cout<<a<<endl;
    }
    
  2. Rvalue reference parameter

    void printInt(int&& a)
    {
        cout<<a<<endl;
    }    
    
  3. Both lvalue and rvalue. but how?

    void printInt(const int& a)
    {
        cout<<a<<endl;
    }
    

你可以将其视为保护const正确性的机制。如果没有将引用声明为const,那么就告诉编译器你可能会对参数进行更改,但修改临时rvalue对象的含义是什么呢?语言禁止这样做。 - Mark
1个回答

9

const int&是一个左值引用。问题在于语言规定它可以绑定到右值。int&也是一个左值引用,但它不能这样做。这就是为什么第一个版本有效而第二个版本无效的原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接