以下代码无法在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右值引用可以解决问题。任何人都可以对此有所了解吗?
答案 0 :(得分:3)
C ++中的函数类型可能没有函数类型的返回类型,[dcl.fct] / 10:
函数不应具有类型数组或函数的返回类型,尽管它们可能具有类型指针的返回类型或对此类事物的引用。
因此,当FuncType
被推断为函数类型时,声称的类型FuncType(Args...)
格式不正确。