gpt4 book ai didi

c++ - 为什么转发引用需要 std::forward

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:27:05 24 4
gpt4 key购买 nike

<分区>

在这样的函数模板中

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

不是 x foo 中的右值引用, 如果 foo用右值引用调用?如果使用左值引用调用 foo,则无论如何都不需要强制转换,因为 x也将是 foo 内部的左值引用.还有 T将被推导为左值引用类型,因此 std::forward<T>不会改变 x 的类型.

我使用 boost::typeindex 进行了测试使用和不使用 std::forward<T> 时,我得到的类型完全相同.

#include <iostream>
#include <utility>

#include <boost/type_index.hpp>

using std::cout;
using std::endl;

template <typename T> struct __ { };

template <typename T> struct prt_type { };
template <typename T>
std::ostream& operator<<(std::ostream& os, prt_type<T>) {
os << "\033[1;35m" << boost::typeindex::type_id<T>().pretty_name()
<< "\033[0m";
return os;
}

template <typename T>
void foo(T&& x) {
cout << prt_type<__<T>>{} << endl;
cout << prt_type<__<decltype(x)>>{} << endl;
cout << prt_type<__<decltype(std::forward<T>(x))>>{} << endl;
cout << endl;
}

int main(int argc, char* argv[])
{
foo(1);

int i = 2;
foo (i);

const int j = 3;
foo(j);

foo(std::move(i));

return 0;
}

g++ -Wall test.cc && ./a.out 的输出与 gcc 6.2.0boost 1.62.0

__<int>
__<int&&>
__<int&&>

__<int&>
__<int&>
__<int&>

__<int const&>
__<int const&>
__<int const&>

__<int>
__<int&&>
__<int&&>

编辑:我找到了这个答案:https://stackoverflow.com/a/27409428/2640636显然,

as soon as you give a name to the parameter it is an lvalue.

那么我的问题是,为什么选择这种行为而不是将右值引用保留为右值,即使它们已被赋予名称?在我看来,可以通过这种方式规避整个转发考验。

Edit2:我不是在问什么 std::forward做。我在问为什么需要它。

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