c++ - 右值重载?
问题描述
下面是演示问题的代码:
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&& 类型的变量和这个类型的重载,但是这个重载没有被调用。
解决方案
参考并不是那样工作的。你的论点rvalue_ref
,尽管它的类型,是一个左值表达式。您将不得不std::move
再次使其成为右值。
类型和值类别是两个独立的东西,很难记住命名右值引用类型对象的表达式不会自动成为右值表达式。
还要考虑:
void foo(T&& ref)
{
bar(ref); // lvalue arg
bar(std::move(ref)); // rvalue arg
}
cppreference.com 的“价值类别”文章中也提到了这一点:
即使变量的类型是右值引用,由其名称组成的表达式也是左值表达式
推荐阅读
- php - 编码图像网址是可能的
- java - ScrollView 内的 LinearLayout 扩展不够远
- javascript - 根据滚动条位置更改元素的不透明度
- javascript - 我无法从 `document.getElementById` 中获取值
- python - MacOS 上的 Python3、gcc 和 clang
- reactjs - React - 如何在异步函数之外获取获取的数据?
- node.js - Postgres 连接池错误排查
- python - Python列表中第一次出现零的索引
- ruby - 如何解析列表中的两个元素以创建一个新元素
- java - 使用 Selenium 按类名查找数组中的元素