gpt4 book ai didi

c++ - 无法推断出作为函数的模板参数

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:30:43 24 4
gpt4 key购买 nike

为什么不能为 proxy() 推导出 F

这应该是可能的,因为我正在限制它 - 仅适用于返回 int 的函数。

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

int foo(int bar) {
cout << "int" << endl;
return 2;
}

float foo(float bar) {
cout << "float" << endl;
return 1;
}

template <typename F, typename... Args>
typename enable_if<
is_same<
typename result_of<F(Args...)>::type,
int
>::value,
typename result_of<F(Args...)>::type
>::type
proxy(F func, Args&&... args) {
return func(forward<Args>(args)...);
}

int main() {
proxy(foo, 5);
}

这里是错误:

b.cpp:29:17: error: no matching function for call to 'proxy(<unresolved overloaded function type>, int)'
b.cpp:24:1: note: template argument deduction/substitution failed:
b.cpp:29:17: note: couldn't deduce template parameter 'F'

最佳答案

问题是这样的:

proxy(foo, 5);

编译器尝试推断foo 的类型,但有 2 个重载。当然,它可以从 5 推导出 Args...,但是 foo 的类型仍然是不可推导的,因为编译器不在进行类型推导时不知道选择哪个重载。

请注意,编译器需要知道函数签名中 F 的类型,即此处,因此 SFINAE 发挥了它的魔力:

is_same<
typename result_of<F(Args...)>::type,
int
>::value,

它绝对没有办法从 proxy(foo, 5) 调用中正确推断出 F 的类型,因此 SFINAE 无法启动。作为一个方面请注意,C++ 不能仅根据返回类型进行重载。因此,您将无法仅根据返回类型来区分具有相同名称的两个函数。您需要以某种方式强制进行参数匹配,这将使 SFINAE 排除非候选重载。

某种程度上相关:Deducing the return type of a standalone function

以及来自标准的相关引用,强调我的(感谢@T.C. 指出):

14.8.2.1 从函数调用推导模板参数 [temp.deduct.call]/(6.2)

(6) When P is a function type, pointer to function type, or pointer to member function type:

  • (6.1) If the argument is an overload set containing one or more function templates, the parameter is treated as a non-deduced context.

  • (6.2) If the argument is an overload set (not containing functiontemplates), trial argument deduction is attempted using each of themembers of the set. If deduction succeeds for only one of the overloadset members, that member is used as the argument value for thededuction. If deduction succeeds for more than one member of theoverload set the parameter is treated as a non-deduced context.

关于c++ - 无法推断出作为函数的模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30623939/

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