为什么不允许将右值引用绑定到非常数引用,而允许在其中一个上调用非常数成员函数
Why are you not allowed to bind a rvalue reference to a non const reference but you are allowed to call non const member functions on one
以下内容在危险性方面大致相当,但语言不允许使用第二个2,而第一个则不然。
#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++让你做一些可能危险但可能有益的事情时,它会让它通过),但奇怪的是,这里有区别。
函数参数要进行类型转换,这会创建一个临时的右值。如果函数被传递了一个对该临时函数的非常数引用,而您希望它修改参数,这将导致混乱的结果。这种潜在的混淆是不允许临时变量绑定到非常量左值引用的理由。
其他引用类型没有相应的混淆;const
引用使对象按预期保持不变,并且右值引用专门用于绑定右值
相关文章:
- 将对象数组的引用传递给函数
- 什么时候在C++中返回常量引用是个好主意
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 何时在引用或唯一指针上使用移动语义
- 如何在c++中使用引用实现类似python的行为
- 编译C++时未定义的引用
- Ctypes wstring通过引用传递
- c++r值引用应用于函数指针
- 理解c++中的引用
- C++取消引用指针.为什么会发生变化
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 强制转换为引用类型
- 引用一个已擦除类型(void*)的指针
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 列出生成器(lambda的向量)会导致通过引用捕获的非常奇怪的行为
- 从对象调用成员对象,错误:引用非常量值的初始值必须是左值
- 一个非常弱的引用(无法转换为共享)
- 阻止const类函数在引用成员上调用非常常量类函数