gpt4 book ai didi

c++ - const ref 类型的函数参数模板参数不明确

转载 作者:太空狗 更新时间:2023-10-29 23:50:19 25 4
gpt4 key购买 nike

我在将 const ref 参数传递给调用其他函数的模板函数时遇到问题。考虑以下代码:

struct A
{
void foo(const int& i) { }
};

template <class ...Args>
void a_caller(A& a, void(A::*f)(Args...), Args&& ...args)
{
(a.*f)(std::forward<Args>(args)...);
}

int main()
{
int i = 42;
A a;

a_caller(a, &A::foo, i); // (1) compiler error
a_caller<const int&>(a, &A::foo, i); // (2) ok
}

所以,我有一个成员函数 A::foo,它带有我想在包装器 a_caller 中调用的 const int& 参数。第 (1) 行导致以下错误:

'void a_caller(A &,void (__thiscall A::* )(Args...),Args &&...)' : template parameter 'Args' is ambiguous
see declaration of 'a_caller'
could be 'const int&'
or 'int&'

我的第一个问题是为什么会这样?我给编译器一个非重载函数 A::foo,为什么它不能从中推导出 Args?第二个问题是为什么 std::make_unique 不会发生这种情况呢?下面的代码在我看来是一样的,但是编译器在推断构造函数参数类型时没有问题:

struct A
{
A(const int& i) { }
};

int main()
{
int i = 42;
auto aptr = std::make_unique<A>(i);
}

最佳答案

您正试图硬塞 Args 来履行两个截然不同(且不一定兼容)的角色。第一个作用是f的参数类型。第二个是给 a_caller 的参数类型。

由于实现完美转发的方式,在您的示例中传递 i 想要推断此 iArgs 类型为 整数&。然而,A::foo 中的相同 Args 类型是 const int & 类型——因此推导不明确。

在某种程度上,完美转发的全部要点在于转发参数的类型是当场推断的(并且通常不能重复用于其他任何事情)。所以你必须做这样的事情:

template <class ...Params, class ...Args>
void a_caller(A& a, void(A::*f)(Params...), Args&& ...args)
{
(a.*f)(std::forward<Args>(args)...);
}

当参数与参数不匹配时,您将不得不依赖 f 的调用来告诉您。

关于c++ - const ref 类型的函数参数模板参数不明确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32050531/

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