- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在学习模板,尤其是 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
, 其中_Ty
在non-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/
我正在为 64 位构建软件,之前是为 32 位构建的软件。当我为 64 位构建软件时,该软件完全适用于 32 位,它给出了一些错误,如 error C2782: 'const _Ty &std::mi
我有一个并发队列的模板化实现,它具有如下所示的推送功能: template class concurrent_queue { public: // other code... voi
我在尝试编译以下内容时收到此错误消息 void MyClass::MyFunc() const { int i= 0; myList.push_back(i); } 尽管它返回
我收到以下错误: error C2440: 'static_cast' : cannot convert from 'std::shared_ptr' to 'std::shared_ptr stac
你好,我有两个问题: cannot convert from 'std::vector' to 'std::vector & void CMapObjectPropertyPageAmbience::
我正在实现一个 Visual C++ 项目,它使用 Windows 窗体。我需要使用 C++ 堆栈,我使用了 stack<> .但它给出了这个错误。我包括 #include 和 using names
这个问题在这里已经有了答案: C++: Can I cast a vector to a vector during a function call? (5 个答案) 关闭 9 年前。 问题1>
目前我正在尝试使用 std::unique_ptr,但我在 Visual Studio 2012 中遇到编译器错误。 class A { private: unique_ptr other; pub
如何更正下面的代码以避免出现错误消息?这段代码不应该工作吗?是否可以使用不同的技术(packaged_task、asynch)? #include #include using namespace
错误 C2664:“void std::vector::push_back(_Ty&&)”:无法将参数 1 从“Node *”转换为“Node&&” 我需要帮助... 我创建了 node.h 和 he
我在我的 cpp 函数中引用了一个模板化的快速排序方法,如下所示: main.cpp QuickSort>(testData); testData 在哪里: int arr[] = {0, 5, 3,
我试图通过使用静态断言来禁止创建 const MyClass 类型。当一个类被声明为 const 时,this 关键字的类型为 const MyClass* 所以我认为这会起作用 class MyCl
我正在学习模板,尤其是 std::forward ;当我检查它的实现时,它使用另一个类模板 std::remove_reference在其参数列表中: template _Ty&& forward(t
在完成我的游戏原型(prototype)时,我遇到了这个错误,我以前从未见过。我试图将两个 .cpp 文件链接在一起,这个: #include #include "mage.h"
我目前有一个如下所示的类。 #define SET_METHOD( t , n ) \ private: t n; \ public: void set_##n( t value
//define typedef std::vector vertex_data; //serialise std::ostringstream oss; boost::archive::text_o
我有一个头文件SomeDefines.h,其中包括 #define U64 unsigned long long #define U16 unsigned short 在Myclass.h中,我在顶部
priority_queue> wait_queue; 去编译我的作业并修复所有错误,除了关于这行代码的错误.. 最佳答案 std::priority_queue 的第二个模板参数是适配容器,而不是比
以下代码有效: void CMyPlugin8::myMessageBox(std::string& myString) { myString = "Received the followin
我正在将一些 C++ 代码从 VisualStudio 6 升级到 VisualStudio 2008。 有一个类“GenExportableTree”,看起来很像来自 Dinkumware 的 xt
我是一名优秀的程序员,十分优秀!