gpt4 book ai didi

c++ - std::forward 不传递左值引用

转载 作者:行者123 更新时间:2023-12-05 05:46:28 25 4
gpt4 key购买 nike

我可能在这里遗漏了一些基本的东西,但为什么我不从下面的 std:forward 中得到一个左值?

#include <iostream>
#include <utility>

template <typename T>
void f(const T& lhs) {
std::cout << "lvalue" << "\n";
}

template <typename T>
void f(const T&& rhs) { // const, so as not to have a universal reference
std::cout << "rvalue" << "\n";
}

int main() {
auto a = 3;
f(a); // lvalue
f(3); // rvalue
f(std::forward<int>(a)); // rvalue ???
}

编译为

lvalue
rvalue
rvalue

我希望最后的结果是左值。

最佳答案

std::forward 是一个有条件的 std::move。只有在模板内部使用它才有意义,您可以根据模板参数选择是否移动。

像这样:

template <typename T>
void foo(T &&value)
{
f(std::forward<T>(value));
}

这里,T &&value 被称为转发引用(因为 long T 是由编译器推导出来的,而不是手动指定的),即可以接受左值和右值。

如果您将右值传递给此函数,T 将被推断为非引用,因此 T &&value 仍然是右值引用。

如果您传递一个左值,T 将被推导为一个左值引用,而 T &&value 将成为一个左值引用(参见 reference collapsing rules)。

要使用转发引用,std::forward 如果其模板参数不是引用则充当 std::move,如果其模板参数不执行任何操作是左值引用。

由于您向它传递了一个非引用,所以您采取了行动,但同样,这不是它的预期用例。

关于c++ - std::forward 不传递左值引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71183100/

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