C++ std::使用可变模板和自动返回类型绑定

C++ std::使用可变模板和自动返回类型绑定,c++,variadic-templates,c++17,C++,Variadic Templates,C++17,在中的代码之后,我有一个带有可变模板函数的std::bind。如果我试图提供带有autoreturn的函数模板,gcc会拒绝该程序: #include <functional> template <typename... Args auto inv_impl(Args... a) { return (a + ...); } template <typename... Args> auto inv(Args... args) { auto bound = st

在中的代码之后,我有一个带有可变模板函数的
std::bind
。如果我试图提供带有
auto
return的函数模板,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);
}
#包括

模板这绝对是一个gcc错误(已存档)

解决办法就是。。。不要使用
std::bind()
。无论如何,几乎没有理由这么做。Lambda绝对优于:

template <typename... Args>
auto inv(Args... args) {
  return [=]{ return inv_impl(args...); };
}
模板
自动库存(Args…Args){
return[=]{return inv_impl(args…)};
}

很有趣。在我看来,您的示例过于复杂:您可以使用
#include template auto foo(T){return 1;}int main(){auto bound=std::bind(&foo,1);}
获得相同的错误(来自g++;来自clang++),这似乎是一个gcc错误,使用clang按预期编译。作为解决方法,您可以使用:
template auto invoke_impl(Args…a)->decltype((a+…){return(a+…);}
。顺便说一句,“有问题的”(针对bug)不是
std::bind
,而是引用函数。
template <typename... Args>
auto inv(Args... args) {
  return [=]{ return inv_impl(args...); };
}