我正试图将一个函数模板作为参数传递给另一个函数,如下例所示。
#include <iostream>
template <typename T>
decltype(auto) foo(T t)
{
return t;
}
template <typename Fn, typename T>
decltype(auto) bar(Fn fn, T t)
{
return fn(t);
}
int main()
{
int arg = 0;
std::cout << bar(foo<decltype(arg)>, arg) << std::endl;
return 0;
}
虽然这在clang 9.0和msvc v19.24中有效,但在gcc 9.2 中失败
gcc输出:
no matching function for call to 'bar(<unresolved overloaded function type>, int&)' std::cout << bar(foo<decltype(arg)>, arg) << std::endl;
这是gcc中的一个错误吗?我也可以在gcc中以某种方式规避这一点吗?
Godbolt链接:https://godbolt.org/z/oCChAT
对于gcc,另一种解决方法可以是:
auto f = foo<decltype(arg)>;
std::cout << bar(f, arg) << std::endl;
是的,这应该是gcc的一个bug,即使在gcc 10.0.1中也没有修复。
当使用占位符类型说明符(如auto
和decltype(auto)
(指定返回类型时,gcc似乎无法处理这种情况。如果将返回类型指定为T
,则可以正常工作。