result_of无法推断出返回类型

时间:2015-12-23 11:27:42

标签: c++ templates types typetraits

以下代码无法在GCC 5.2中编译:

template<typename FuncType, typename... ArgTypes>
result_of_t<FuncType(ArgTypes...)> FuncCall(const FuncType &f, ArgTypes&... args)
{
    return f(forward<ArgTypes>(args)...);
}

string SomeFunc()
{
    return "SomeFunc";
}

int main()
{
    cout << FuncCall([](){return "Lambda";}) << "\n"; // This call works properly
    cout << FuncCall(SomeFunc) << "\n"; // this call fails
}

但如果我更改以下行:

result_of_t<FuncType(ArgTypes...)> FuncCall(const FuncType &f, ArgTypes&... args)

result_of_t<FuncType&&(ArgTypes...)> FuncCall(const FuncType &f, ArgTypes&... args)

然后它正常工作。

我不明白在这种情况下如何制作FuncType右值引用可以解决问题。任何人都可以对此有所了解吗?

1 个答案:

答案 0 :(得分:3)

C ++中的函数类型可能没有函数类型的返回类型,[dcl.fct] / 10:

  

函数不应具有类型数组或函数的返回类型,尽管它们可能具有类型指针的返回类型或对此类事物的引用。

因此,当FuncType被推断为函数类型时,声称的类型FuncType(Args...)格式不正确。