c++ - 左值和右值作为函数参数

标签 c++ rvalue-reference template-argument-deduction const-reference reference-binding

我正在尝试理解 C++ 中的左值和右值。

所以我将它们用作传递给函数的参数。 在第一种情况下,我有两个函数,第一个函数引用了一个 const int,在这种情况下,多亏了“const”(参见 link),我可以将左值和右值都传递给第一个函数,我将拥有没问题。 在第二个函数中,我不得不传递一个 Rvlaue,否则我会得到描述的错误。

void f1(const int& n){cout<<"[Lvalue]"<<endl;}
void f2(int&& n){cout<<"[Rvalue]"<<endl;}

int main()
{   
    const int n = 10;
    f1(n);
    f2(n);  //error: cannot bind rvalue reference of type ‘int&&’ to lvalue of type ‘const int’

}

好的!

为什么如果第二个函数变成了一个函数模板,就像在下面的例子中我也可以传递一个左值。

void f1(const int& n){cout<<"[Lvalue]"<<endl;}
template<class T>
void f2(T&& n){cout<<"[Rvalue]"<<endl;}

int main()
{   
    const int n = 10;
    f1(n);
    f2(n); //ok
}

最佳答案

重要的是 T 被推断为引用。所以,如果 Tconst int&,那么 T&& 是什么,即 const int& &&引用折叠规则说它是const int&

因此,当推导T&&中的T时,&&不表示右值引用,而是推导其类型的引用,并且可以是右值或左值引用,具体取决于推导的结果。据说是转发引用。

关于c++ - 左值和右值作为函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53731050/

相关文章:

c++ - 如何使用 Eigen 库计算矩阵的右核?

c++ - 什么时候对原始整数的右值引用是短期的还是长期的?

c++ - 我可以在这里使用模板特化或类型强制吗?

c++ - 为什么 int foo() 是右值,而 int& foo() 在这个例子中是左值?

c++ - 为什么 `std::reference_wrapper` 秒内不能推导出模板实例?

c++ - 函数的可选模板化参数

c++ - 为什么这个初始化列表不能匹配模板参数?

c++ - 为什么不允许这种部分填充的模板和界面的组合?

c++ - 为什么 RVO 和 NRVO 不是标准强制要求的?

c++ - 段错误取决于我在 C++ 中声明的顺序