bim*_*bam 5 c++ rvalue rvalue-reference c++11
我想知道有一个右值引用变量(不是作为函数参数)是否有意义?我理解右值引用在用作函数变量时的使用,因为这样可以避免不必要的分配等。但是是否存在不是函数参数的用例右值引用变量?一开始我以为有了这样的变量,我们可以捕获作为右值传入的数据供以后使用,但似乎如果我们有一个右值引用变量,那么我们已经可以获取它的地址,因此它不能再是右值引用了。
我尝试了以下代码,它(不出所料)无法编译。那么为什么我想要一个右值引用变量呢?
void test(int&& a) {}
int&& a(22);
test(a);
Run Code Online (Sandbox Code Playgroud)
谢谢!
你a在这里是一个右值引用的名称。a本身是一个右值引用类型的左值(你可以获取它的地址)(是的,有点混乱)。因此,无论何时传递ato test(a),都会传递一个左值。将左值视为任何具有名称的对象,或者您可以稍后获取其地址。并且您不能将左值绑定到右值引用,因此编译错误
错误:无法将“int”左值绑定到“int&&”
你需要通过std::move(a)。在这种情况下,您抛弃了 的左值a。
请注意,您的函数内部a也是一个左值(同样,您可以对其执行左值操作,例如获取其地址等)。std::move任何时候您想将其用作右值时都需要强制转换 ( )。例如,假设您有一个Bar带有成员变量的对象Foo member;,并且您想通过成员函数移动到它f:
void Bar::f(Foo&& param)
{
member = std::move(param); // need std::move here to move param into member
}
// invoked it as
bar.f(std::move(some_foo)); // move some_foo into param
Run Code Online (Sandbox Code Playgroud)
如果您不param使用 强制转换为右值引用std::move,则您不会param进入member,您只需复制它(如果param是可复制的,否则您会收到编译时错误),因为param它本身是一个左值。希望这能澄清它。
| 归档时间: |
|
| 查看次数: |
1395 次 |
| 最近记录: |