繁体   English   中英

C++0x const RValue 引用为 function 参数

[英]C++0x const RValue reference as function parameter

我试图理解为什么有人会编写一个采用const rvalue reference的 function 。

在下面的代码示例中,const 右值引用 function(返回“3”)的用途是什么。 以及为什么重载解析优先于 const LValue 参考 function (返回“2”)之上的 const Rvalue。

#include <string>
#include <vector>
#include <iostream>

std::vector<std::string> createVector() { return std::vector<std::string>(); } 

//takes movable rvalue
void func(std::vector<std::string> &&p) { std::cout << "1"; }

//takes const lvalue
void func(const std::vector<std::string> &p)  { std::cout << "2"; }

//takes const rvalue???
//what is the point of const rvalue? if const I assume it is not movable?
void func(const std::vector<std::string> &&p) { std::cout << "3"; }

int main()
{
    func(createVector());
    return 0;
}

左值非常喜欢绑定到左值引用,同样,右值引用也非常喜欢绑定到右值引用。 可修改表达式较弱地倾向于绑定到非常量引用。

因此,当您的编译器进行重载解析时,它会检查是否存在采用右值引用的重载,因为这是强烈推荐的。 在这种情况下,由于表达式是可修改的右值,所以右值引用重载获胜。

实际上有用于 const rvalue 引用,它们可用于确保某些内容绑定到 rvalue。 请记住,右值绑定到 const 左值引用,因此如果您这样做了:

template <typename T> void foo(const T& bar) { /* ... */ }

并将 function 称为:

foo(createVector());

它工作得很好。 但是,有时需要确保您只能将左值传递给 function(这是std::ref的情况)。 您可以通过添加重载来实现此目的:

template <typename T> void foo(const T&&) = delete;

请记住,右值非常喜欢绑定到右值引用,而可修改表达式更喜欢弱绑定到非常量引用。 由于我们有一个 const rvalue-reference,这基本上意味着每个 rvalue 都将绑定到 this,因此如果您尝试将 rvalue 传递给foo() ,您的编译器会出错。 这是实现此类功能的唯一方法,因此有时很有用。

重载解析更喜欢 const 右值而不是 const 左值,因为它是一个右值,并且您将它绑定到一个右值引用,但是在这两种情况下都必须添加 const,所以右值引用绝对是首选。

这样的事情通常是没有意义的——最好让它们绑定到 const 左值重载。 const rvalues 没有任何实际用途。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM