std::绑定variadic模板和自动返回类型

std::bind with variadic template and auto return type

本文关键字:返回类型 绑定 variadic std      更新时间:2023-10-16

根据这个问题中的代码,我有一个带有可变模板函数的std::bind。如果我试图提供一个返回auto的函数模板,gcc会拒绝程序:

#include <functional>
template <typename... Args
auto inv_impl(Args... a) { return (a + ...); }
template <typename... Args>
auto inv(Args... args) {
auto bound = std::bind(&inv_impl<Args...>, args...);
return bound;
}
int main() {
auto b = inv(1, 2);
}

编译错误为:

foo.cc: In instantiation of ‘auto inv(Args ...) [with Args = {int, int}]’:
foo.cc:41:30:   required from here
foo.cc:36:25: error: no matching function for call to ‘bind(<unresolved overloaded function type>, int&, int& ’
auto bound = std::bind(&inv_impl<Args...>, args...);
~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from foo.cc:2:
/usr/include/c++/8.1.1/functional:808:5: note: candidate: ‘template<class _Func, class ... _BoundArgs> typename std::_Bind_helper<std::__is_socketlike<_Func>::value, _Func, _BoundArgs ...>::type std::bind(_Func&&, _BoundArgs&& ...)’
bind(_Func&& __f, _BoundArgs&&... __args)
^~~~
/usr/include/c++/8.1.1/functional:808:5: note:   template argument deduction/substitution failed:
foo.cc:36:25: note:   couldn't deduce template parameter ‘_Func’
auto bound = std::bind(&inv_impl<Args...>, args...);
~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from foo.cc:2:
/usr/include/c++/8.1.1/functional:832:5: note: candidate: ‘template<class _Result, class _Func, class ... _BoundArgs> typename std::_Bindres_helper<_Result, _Func, _BoundArgs>::type std::bind(_Func&&, _BoundArgs&& ...)’  
bind(_Func&& __f, _BoundArgs&&... __args)
^~~~
/usr/include/c++/8.1.1/functional:832:5: note:   template argument deduction/substitution failed:
foo.cc:36:25: note:   couldn't deduce template parameter ‘_Result’
auto bound = std::bind(&inv_impl<Args...>, args...);
~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
foo.cc:37:10: error: unable to deduce ‘auto’ from ‘bound’
return bound;
^~~~~ 
foo.cc: In function ‘int main()’:
foo.cc:41:8: error: ‘void b’ has incomplete type
auto b = inv<int, int>(1, 2);
^

据我所见,我拼写的返回类型是有效的,只有auto返回类型是编译器无法处理的。

有没有一种方法可以在代码写入时从inv_impl返回而不知道返回类型?(我在玩declval/decltype结构,但我想知道是否有更好的东西(

这绝对是一个gcc错误(文件86826(。

解决方案是。。。不使用CCD_ 6。无论如何,几乎没有理由这么做。Lambdas绝对优越:

template <typename... Args>
auto inv(Args... args) {
return [=]{ return inv_impl(args...); };
}
相关文章: