gpt4 book ai didi

c++ - 将参数从模板转发到不同类型的函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:08:20 25 4
gpt4 key购买 nike

我正在试验模板和转发。写了一些让我吃惊的简单实验代码。我想更好地理解这种机制,可能我在这里缺乏一些知识,因此我寻求帮助。您能否解释一下为什么我在下面的代码中的两个调用无法编译(PLACE 2 和 3)?

#include <iostream>
#include <memory>
#include <utility>
using namespace std;

void h2rvalref(int&& i) { cout << "h2rvalref" << endl; }
void h2ref(int& i) { cout << "h2ref" << endl; }
void h2val(int i) { cout << "h2val" << endl; }

template <class T, class X>
void h1(T&& t, X x) { x(forward<T>(t)); }

int main()
{
// PLACE (1)
h1<int, decltype(h2rvalref)>(1, h2rvalref);

auto b = 1;
// PLACE (2)
// h1<int, decltype(h2ref)>(b, h2ref); // --> ERROR - no matching function..., cannot convert 'b' (type 'int') to type 'int&&'

// PLACE (3)
// h1<int, decltype(h2val)>(b, h2val); // --> ERROR - no matching function..., cannot convert 'b' (type 'int') to type 'int&&'
}

我不明白为什么当我的值 b 是 int 类型时,错误会提示将 int 转换为 int&&。

最佳答案

问题是您正在为函数提供显式模板参数。当您明确提供要转发的类型的模板参数时,转发参数不起作用(除非您真的知道自己在做什么)。

template <class T, class X>
void h1(T&& t, X x) { x(forward<T>(t)); }

当你写 h1<int, decltype(h2ref)> ,你会得到这样的函数:

void h1(int&& t, decltype(h2ref) x) { x(forward<int>(t)); }

int&&int 的类型不同并且不能绑定(bind)到 int 类型的左值例如b你传入;它只能绑定(bind)到 int 类型的右值


如果您不使用模板参数,它就可以正常工作:

h1(b, h2ref);

这将实例化一个如下所示的函数:

void h1(int& t, // int& && collapses to just int&
decltype(h2ref) x) {
x(forward<int&>(t));
}

关于c++ - 将参数从模板转发到不同类型的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46084288/

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