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

丹尼尔

从我阅读和看到的内容来看,您无法将作为右值的表达式绑定到左值引用。但是,我看到的是可以将右值绑定到右值引用,并且由于命名的右值引用本质上是左值,因此可以将其绑定到左值引用。不允许将右值绑定到左值引用的原因是什么?是否出于优化目的?

举个例子:

#include <iostream>

using std::cout;

void bar ( int& b ) {

    cout << "bar " << b << "\n";
    b = 3;
}

void foo ( int&& a ) {

    cout << a << "\n";
    bar(a);
    cout << a << "\n";
}

int main ( int argc, char ** argv ) {

    foo(1);
}
轨道轻赛

这是C ++的基本规则,它可以防止错误:

int foo();

int& x = 3;      // whoops
int& y = foo();  // whoops (sometimes)

至少部分地创建了“ Rvalue引用”(一组类型;不要与实际的rvalue混淆),以便在您确实想要执行以下操作时仍可以执行此操作:

int&& x = 3;     // oh, go on then *sigh*
int&& y = foo(); // you'd better be sure!

在前面的示例中,我将rvalue表达式“引用”的对象绑定(或尝试绑定)到引用。

现在,我将由左值表达式命名的对象绑定到引用:

int i = foo();

int& x = i;      // no problem michael

并且要确保您确实打算从左值表达式中获取右值引用,并引入了难以置信的名称不佳的名称std::move

int&& x = std::move(i);  // doesn't move anything

这些后来的规则远比最初的基本规则晚了很多,而过去的基本规则无疑在过去的20年中避免了许多错误。

注意,Visual Studio中历来公认的T& x = bar(),其中T是一个用户定义的类型; 去搞清楚。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

为什么我可以将表单绑定到$ index,但不能插值名称呢?

来自分类Dev

左值到右值引用绑定

来自分类Dev

左值到右值引用绑定

来自分类Dev

返回语句将右值引用绑定到左值?

来自分类Dev

将右值绑定到左值引用

来自分类Dev

为什么我可以在C ++中使用for循环将右值绑定到非const引用?

来自分类Dev

为什么右值引用可以绑定到非引用类型

来自分类Dev

传递右值加注不能绑定到左值

来自分类Dev

为什么此代码给出错误“无法将类型'char *&'的非常量左值引用绑定到类型为'char *'的右值”

来自分类Dev

在成员函数中不能将左值绑定到右值,但在全局函数中可以

来自分类Dev

将临时右值绑定到std :: vector构造函数中的引用左值

来自分类Dev

为什么不允许将右值引用绑定到非const引用,但是却可以在一个对象上调用非const成员函数

来自分类Dev

将const引用绑定到右值引用

来自分类Dev

左值引用绑定

来自分类Dev

const引用如何绑定到右值

来自分类Dev

具有c ++ 11标志的clang ++显示右值引用无法绑定到左值错误

来自分类Dev

具有c ++ 11标志的clang ++显示右值引用无法绑定到左值错误

来自分类Dev

由于字符串文字被视为左值,为什么绑定左值引用必须是const?

来自分类Dev

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

来自分类Dev

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

来自分类Dev

std :: async使用绑定到lambda的右值引用

来自分类Dev

为什么直接绑定我们的&foo不起作用,但是通过动态查找间接起作用呢?

来自分类Dev

为什么我可以将表单绑定到$ index,但不能插入名称?

来自分类Dev

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

来自分类Dev

为什么临时对象可以绑定到 const 引用?

来自分类Dev

为什么我可以使用int构造函数将int绑定到类的引用?

来自分类Dev

javascript:为什么某些功能可以绑定和映射,而另一些则不能呢?

来自分类Dev

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

Related 相关文章

  1. 1

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

  2. 2

    为什么我可以将表单绑定到$ index,但不能插值名称呢?

  3. 3

    左值到右值引用绑定

  4. 4

    左值到右值引用绑定

  5. 5

    返回语句将右值引用绑定到左值?

  6. 6

    将右值绑定到左值引用

  7. 7

    为什么我可以在C ++中使用for循环将右值绑定到非const引用?

  8. 8

    为什么右值引用可以绑定到非引用类型

  9. 9

    传递右值加注不能绑定到左值

  10. 10

    为什么此代码给出错误“无法将类型'char *&'的非常量左值引用绑定到类型为'char *'的右值”

  11. 11

    在成员函数中不能将左值绑定到右值,但在全局函数中可以

  12. 12

    将临时右值绑定到std :: vector构造函数中的引用左值

  13. 13

    为什么不允许将右值引用绑定到非const引用,但是却可以在一个对象上调用非const成员函数

  14. 14

    将const引用绑定到右值引用

  15. 15

    左值引用绑定

  16. 16

    const引用如何绑定到右值

  17. 17

    具有c ++ 11标志的clang ++显示右值引用无法绑定到左值错误

  18. 18

    具有c ++ 11标志的clang ++显示右值引用无法绑定到左值错误

  19. 19

    由于字符串文字被视为左值,为什么绑定左值引用必须是const?

  20. 20

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

  21. 21

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

  22. 22

    std :: async使用绑定到lambda的右值引用

  23. 23

    为什么直接绑定我们的&foo不起作用,但是通过动态查找间接起作用呢?

  24. 24

    为什么我可以将表单绑定到$ index,但不能插入名称?

  25. 25

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

  26. 26

    为什么临时对象可以绑定到 const 引用?

  27. 27

    为什么我可以使用int构造函数将int绑定到类的引用?

  28. 28

    javascript:为什么某些功能可以绑定和映射,而另一些则不能呢?

  29. 29

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

热门标签

归档