首页 > 解决方案 > 右值重载?

问题描述

下面是演示问题的代码:

class X {};
X x;
X&& rvalue_ref = std::move(x);
static_assert(std::is_same<decltype(rvalue_ref), X&&>::value, "Different types"); //To be sure that type is X&&
void func(X&) {
    cout << "lvalue reference";
}

void func(X&&) {
    cout << "rvalue reference";
}
int main() {
    func(rvalue_ref);
}

输出:

lvalue reference

你能解释一下原因吗?我们有一个 X&& 类型的变量和这个类型的重载,但是这个重载没有被调用。

标签: c++c++11rvalue-referencervaluepass-by-rvalue-reference

解决方案


参考并不是那样工作的。你的论点rvalue_ref,尽管它的类型,是一个左值表达式。您将不得不std::move再次使其成为右值。

类型和值类别是两个独立的东西,很难记住命名右值引用类型对象的表达式不会自动成为右值表达式。

还要考虑:

void foo(T&& ref)
{
   bar(ref);             // lvalue arg
   bar(std::move(ref));  // rvalue arg
}

cppreference.com 的“价值类别”文章中也提到了这一点:

即使变量的类型是右值引用,由其名称组成的表达式也是左值表达式


推荐阅读