gpt4 book ai didi

C++0x const RValue 引用作为函数参数

转载 作者:IT老高 更新时间:2023-10-28 12:51:05 26 4
gpt4 key购买 nike

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

在下面的代码示例中,const rvalue 引用函数的用途是什么(返回“3”)。以及为什么重载解析优先于 const LValue 引用函数(返回“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;
}

最佳答案

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

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

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

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

并调用函数:

foo(createVector());

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

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

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

关于C++0x const RValue 引用作为函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6307526/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com