为什么右值引用作为左值引用传递?

雅各布

pass()引用参数并将其传递给reference,但是一个rvalue参数实际上称为reference(int&)而不是reference(int &&),这是我的代码段:

#include <iostream>
#include <utility>
void reference(int& v) {
    std::cout << "lvalue" << std::endl;
}
void reference(int&& v) {
    std::cout << "rvalue" << std::endl;
}
template <typename T>
void pass(T&& v) {
    reference(v);
}
int main() {
    std::cout << "rvalue pass:";
    pass(1);

    std::cout << "lvalue pass:";
    int p = 1;
    pass(p);

    return 0;
}

输出为:

rvalue pass:lvalue
lvalue pass:lvalue

对于p很容易根据了解参考崩溃规则,但为什么模板函数传递vreference()作为左值?

怀念
template <typename T>
void pass(T&& v) {
    reference(v);
}

您在这里很好地使用了Forwarding引用,但是事实上现在有了一个名称v,它被认为lvaluervalue引用的一个

简而言之,任何具有名称的都是lvalue这就是为什么需要完善转发以获取完整语义,使用std::forward

template <typename T>
void pass(T&& v) {
    reference(std::forward<T>(v));
}

要做std::forward<T>的只是做这样的事情

template <typename T>
void pass(T&& v) {
    reference(static_cast<T&&>(v));
}

看到这个;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

允许左值引用和不允许右值引用作为函数参数?

来自分类Dev

右值引用和左值引用作为参数之间的差异

来自分类Dev

为什么添加const将通用引用作为右值

来自分类Dev

右值引用作为对象字段

来自分类Dev

为什么标准允许左值引用元组分配右值引用元组?

来自分类Dev

为什么重载的移动赋值运算符返回左值引用而不是右值引用?

来自分类Dev

传递输入参数作为右值引用?

来自分类Dev

数据成员作为左值引用或右值副本

来自分类Dev

右值引用可以作为const引用传递吗?

来自分类Dev

使用右值引用作为默认参数

来自分类Dev

为什么右值引用整数合法

来自分类Dev

为什么可以将右值间接绑定到左值引用,而不能直接绑定呢?

来自分类Dev

为什么C ++左值对象不能绑定到右值引用(&&)?

来自分类Dev

为什么将表达式强制转换为右值,对函数的引用是左值?

来自分类Dev

返回const左值引用到右值临时?为什么这样做?

来自分类Dev

为什么不能使用右值来初始化左值引用?

来自分类Dev

通过左值引用修改右值的行为是什么?

来自分类Dev

为什么此函数在给定右值参数的情况下返回左值引用?

来自分类Dev

左值到右值引用绑定

来自分类Dev

左值到右值引用绑定

来自分类Dev

返回作为参数传递给函数的右值引用

来自分类Dev

传递boost :: optional左值作为对函数的引用

来自分类Dev

为什么我可以为右值引用分配值?

来自分类Dev

右值引用到左值引用-UB?

来自分类Dev

通过引用,常量引用,右值引用还是常量右值引用传递?

来自分类Dev

为什么GCC允许通过右值引用捕获?

来自分类Dev

为什么“ decltype(i + j)”的结果不是右值引用?

来自分类Dev

为什么 make_shared 会破坏右值引用?

来自分类Dev

使用左值引用作为非类型模板参数

Related 相关文章

  1. 1

    允许左值引用和不允许右值引用作为函数参数?

  2. 2

    右值引用和左值引用作为参数之间的差异

  3. 3

    为什么添加const将通用引用作为右值

  4. 4

    右值引用作为对象字段

  5. 5

    为什么标准允许左值引用元组分配右值引用元组?

  6. 6

    为什么重载的移动赋值运算符返回左值引用而不是右值引用?

  7. 7

    传递输入参数作为右值引用?

  8. 8

    数据成员作为左值引用或右值副本

  9. 9

    右值引用可以作为const引用传递吗?

  10. 10

    使用右值引用作为默认参数

  11. 11

    为什么右值引用整数合法

  12. 12

    为什么可以将右值间接绑定到左值引用,而不能直接绑定呢?

  13. 13

    为什么C ++左值对象不能绑定到右值引用(&&)?

  14. 14

    为什么将表达式强制转换为右值,对函数的引用是左值?

  15. 15

    返回const左值引用到右值临时?为什么这样做?

  16. 16

    为什么不能使用右值来初始化左值引用?

  17. 17

    通过左值引用修改右值的行为是什么?

  18. 18

    为什么此函数在给定右值参数的情况下返回左值引用?

  19. 19

    左值到右值引用绑定

  20. 20

    左值到右值引用绑定

  21. 21

    返回作为参数传递给函数的右值引用

  22. 22

    传递boost :: optional左值作为对函数的引用

  23. 23

    为什么我可以为右值引用分配值?

  24. 24

    右值引用到左值引用-UB?

  25. 25

    通过引用,常量引用,右值引用还是常量右值引用传递?

  26. 26

    为什么GCC允许通过右值引用捕获?

  27. 27

    为什么“ decltype(i + j)”的结果不是右值引用?

  28. 28

    为什么 make_shared 会破坏右值引用?

  29. 29

    使用左值引用作为非类型模板参数

热门标签

归档