gcc中未解析的重载函数类型



我正试图将一个函数模板作为参数传递给另一个函数,如下例所示。

#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中也没有修复。

当使用占位符类型说明符(如autodecltype(auto)(指定返回类型时,gcc似乎无法处理这种情况。如果将返回类型指定为T,则可以正常工作。

相关内容

  • 没有找到相关文章

最新更新