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

迈克·藤

就危险而言,以下内容大致相同,但该语言不允许使用第二个,但第一个不是。

#include <algorithm>
#include <vector>

int main()
{
    std::vector<int> v;

    // allowed
    std::vector<int>().swap(v);

    // not allowed
    v.swap(std::vector<int>());

    // not allowed
    std::swap(std::vector<int>(), v);
}

我知道Visual Studio允许所有这些作为编译器扩展通过,对于这个问题我将忽略它。

我并不是在争辩第一个是不允许的-我实际上更喜欢第二个是允许的(在某些地方,这会使代码更优雅,并且通常在C ++允许您做一些可能很危险但可能有益的事情时)它可以让它通过),但似乎有点奇怪。

迈克·西摩

函数参数需要进行类型转换,这些转换会创建一个临时的rvalue如果函数被传递了对该临时变量的非常量引用,而您希望该函数修改参数,则结果将令人困惑。这种潜在的混乱是不允许临时对象绑定到非常量左值引用的理由

其他参考类型没有相应的混淆;const引用离开如预期未修饰的对象,而右值的引用具体意在结合右值成员函数也不会出现此问题,因为类型转换不会应用于被调用的对象。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么引用成员可以通过const成员函数进行修改?

来自分类Dev

ISO C ++ 2003标准中不允许引用引用,但是为什么编译器允许引用呢?

来自分类Dev

为什么成员函数mem_fun调用必须是const一个?

来自分类Dev

防止const类函数在引用成员上调用非const类函数

来自分类Dev

为什么const方法不能返回非const引用?

来自分类Dev

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

来自分类Dev

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

来自分类Dev

为什么C ++不允许重新绑定引用?

来自分类Dev

是否可以将一个const变量与一个非const变量以及一个const&引用区分开?

来自分类Dev

当传递给另一个对象时,为什么在const对象上调用std :: move会调用复制构造函数?

来自分类Dev

为什么非成员函数不允许使用类似const的修饰符

来自分类Dev

为什么不允许将非静态成员的地址作为模板非类型参数?

来自分类Dev

const引用如何绑定到右值

来自分类Dev

尽管非默认构造函数参数,也会在const引用成员上调用默认构造函数

来自分类Dev

为什么C不允许从char **到const char * const *的隐式转换(而C ++允许)?

来自分类Dev

为什么不允许仅在一个引用限定符上进行重载?

来自分类Dev

我们可以从const对象中引用一个setter成员函数作为const吗?

来自分类Dev

为什么const方法可以使用非const引用?

来自分类Dev

C ++:为什么我可以将指针值成员变量从const成员函数传递给采用非const指针参数的外部函数?

来自分类Dev

不使用此方法而从const对象调用非const成员函数,为什么会出错?

来自分类Dev

将const引用绑定到右值引用

来自分类Dev

为什么const函数可以使用静态成员对象的非const函数?

来自分类Dev

为什么同时需要const引用和const成员函数?

来自分类Dev

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

来自分类Dev

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

来自分类Dev

在非对象错误上调用成员函数bind_param(),但是SQL可以工作

来自分类Dev

为什么const方法不能返回非const引用?

来自分类Dev

const函数可以在本地对象上调用非const函数吗?

来自分类Dev

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

Related 相关文章

  1. 1

    为什么引用成员可以通过const成员函数进行修改?

  2. 2

    ISO C ++ 2003标准中不允许引用引用,但是为什么编译器允许引用呢?

  3. 3

    为什么成员函数mem_fun调用必须是const一个?

  4. 4

    防止const类函数在引用成员上调用非const类函数

  5. 5

    为什么const方法不能返回非const引用?

  6. 6

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

  7. 7

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

  8. 8

    为什么C ++不允许重新绑定引用?

  9. 9

    是否可以将一个const变量与一个非const变量以及一个const&引用区分开?

  10. 10

    当传递给另一个对象时,为什么在const对象上调用std :: move会调用复制构造函数?

  11. 11

    为什么非成员函数不允许使用类似const的修饰符

  12. 12

    为什么不允许将非静态成员的地址作为模板非类型参数?

  13. 13

    const引用如何绑定到右值

  14. 14

    尽管非默认构造函数参数,也会在const引用成员上调用默认构造函数

  15. 15

    为什么C不允许从char **到const char * const *的隐式转换(而C ++允许)?

  16. 16

    为什么不允许仅在一个引用限定符上进行重载?

  17. 17

    我们可以从const对象中引用一个setter成员函数作为const吗?

  18. 18

    为什么const方法可以使用非const引用?

  19. 19

    C ++:为什么我可以将指针值成员变量从const成员函数传递给采用非const指针参数的外部函数?

  20. 20

    不使用此方法而从const对象调用非const成员函数,为什么会出错?

  21. 21

    将const引用绑定到右值引用

  22. 22

    为什么const函数可以使用静态成员对象的非const函数?

  23. 23

    为什么同时需要const引用和const成员函数?

  24. 24

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

  25. 25

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

  26. 26

    在非对象错误上调用成员函数bind_param(),但是SQL可以工作

  27. 27

    为什么const方法不能返回非const引用?

  28. 28

    const函数可以在本地对象上调用非const函数吗?

  29. 29

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

热门标签

归档