【发布时间】:2019-04-26 11:05:37
【问题描述】:
我正在使用编译器 g++ 6.3.0 (c++14)。 在代码中-
#include<iostream>
int f(auto a){return a;}
int f1(auto (*g)(int),int a) {return g(a);}
main()
{
std::cout<< f1(f,8);
}
编译器无法推断 g 的返回类型。 它显示以下错误 -
temp.cpp: In function 'int main()':
temp.cpp:9:20: error: no matching function for call to 'f1(<unresolved overloaded function type>, int)'
std::cout<< f1(f,8);
^
temp.cpp:5:5: note: candidate: template<class auto:2> int f1(auto:2 (*)(int), int)
int f1(auto (*g)(int),int a) {return g(a);}
^~
temp.cpp:5:5: note: template argument deduction/substitution failed:
temp.cpp:9:20: note: couldn't deduce template parameter 'auto:2'
std::cout<< f1(f,8);
^
但代码中没有错误-
#include<iostream>
int f(int /* <<<<< */ a){return a;} // only (auto a) is changed to (int a)
int f1(auto (*g)(int),int a) {return g(a);}
main()
{
std::cout<< f1(f,8);
}
帮我理解错误...
【问题讨论】:
-
请注意,您依赖的是 gcc 扩展。对于函数参数,C++14 没有
auto这样的特性(即将这些函数转换为模板函数,每个auto都有一个模板参数)。这是具有相同错误但没有auto的等效版本:godbolt.org/z/miMZ3r