我正在尝试将函数模板作为参数传递给另一个函数,如下面的示例所示。
#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的错误,即使在gcc 10.0.1中也没有修复。
当使用诸如auto
和的占位符类型说明符指定返回类型时,gcc似乎无法处理这种情况decltype(auto)
。如果您指定返回类型,T
将可以正常工作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句