【发布时间】:2018-10-16 19:28:39
【问题描述】:
最近我对现代 c++ 进行了研究。我看到了一个关于 c++11/c++14 可变参数模板的video [in 49:00]。如果你想用可变参数模板计算不同类型(如int,double)的元组之和,使用c++11,视频建议了一个解决方案:
struct Sum
{
template<typename T>
static T sum(T n)
{
return n;
}
template<typename T, typename... Args>
static auto sum(T n, Args... rest) -> decltype(n+sum(rest...))
{
return n + sum(rest...);
}
}
auto x = Sum::sum(1, 2.5, 3);
auto 无法推断出c++11 中的返回类型,因此您必须使用decltype 声明返回类型。但是有些编译器构建失败,有些编译器构建成功。link
虽然使用auto to deduce return type没有问题,但我的问题是:
-
c++11标准是否涵盖了这个问题?如果不是,编译器是否通过自己的实现来处理问题? - 为什么最新版
gcc 8.1编译失败,而gcc 4/5/6/7编译成功? gcc 是否存在兼容性问题?
顺便说一下,编译错误信息是:
test.cc:20:16: 错误:没有匹配的函数调用 'sum'
double x = Sum::sum(1, 2.5, 3);test.cc:12:17:注意:候选模板被忽略:替换失败 [with T = int, Args = ]:使用未声明的标识符“sum”
static auto sum(T n, Args... rest) -> decltype(n + sum(rest...))test.cc:6:14:注意:候选函数模板不可行:需要 单个参数“n”,但提供了 3 个参数
static T sum(T n)生成 1 个错误。
【问题讨论】:
-
这在我看来像是一个编译器错误。似乎编译器试图在推导的返回类型中重用
sum的相同实例化。 -
这使用 'struct Sum` 作为命名空间。我会将其更改为
namespace Sum并删除static's。 -
@HenriMenke - 不是错误。功能。
标签: c++ c++11 variadic-templates