gpt4 book ai didi

c++ - std::forward 如何推断 `_Ty` 的类型?

转载 作者:太空狗 更新时间:2023-10-29 19:56:03 24 4
gpt4 key购买 nike

我正在学习模板,尤其是 std::forward ;当我检查它的实现时,它使用另一个类模板 std::remove_reference在其参数列表中:

template<class _Ty>
_Ty&& forward(typename remove_reference<_Ty>::type& _Arg)
{// forward an lvalue as either an lvalue or an rvalue
// ...
}

顺便说一句:为清楚起见,我删除了一些内容,例如内联、constexpr、NO_EXCEPT 和函数体

我读到了当模板参数是指针(_Ty*)、引用(_Ty &)、通用引用(_Ty)以及它只是类型本身(_Ty)时如何推导类型.在这种情况下,它是一个引用,但它添加了 removed_reference<_Ty>::type在它之前; _Ty和引用由对 remove_reference 的调用拆分.编译器如何确定 _Ty 的类型?

函数模板必须使用传递给函数的参数(当没有在函数调用中显式定义它们时)找出模板参数,但在这种情况下,remove_reference 也是一个需要找出类型的类模板_Ty以及。对我来说这似乎是一个陷阱 22,因为 std::forward需要弄清楚_Ty使用它的函数参数但它的函数参数是std::remove_reference<_Ty>需要已经知道什么 _Ty是。所有这一切都告诉我,我对模板的工作原理有一个错误的理解,但我不知道在哪里。

最佳答案

how does the compiler figure out the type of _Ty?

事实并非如此。 std::forward旨在与明确提供的类型一起使用。它是通过接受 std::forward 的函数参数来强制执行的类型为 typename remove_reference<_Ty>::type , 其中_Tynon-deduced context .编译器无法推断出它。

转发引用的典型用法如下:

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

严格来说,std::forward只是转换为 T&& 的语法糖多于。这是reference collapsing做了所有的魔法,但是对 T&& 的裸露没有像指定的运营商那样清楚地传达转发的意图。这就是为什么 std::forward存在。

关于c++ - std::forward 如何推断 `_Ty` 的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56368603/

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