我正在阅读Leor Zolman先生提出的一些名为An Overview of C++11 and C++14的幻灯片 . 在第35页,他介绍了一种使用 decltype
进行求和运算的方法 .
struct Sum {
template <typename T>
static T sum(T n) {
return n;
}
template <typename T, typename... Args>
/// static T sum(T n, Args... rest) {
static auto sum(T n, Args... rest) -> decltype(n + sum(rest...)) {
return n + sum(rest...);
}
};
当使用这个片段 Sum::sum(1, 2.3, 4, 5);
clang-3.6(来自svn)无法用 -std=c++11
/ -std=c++1y
编译它,但gcc-4.9成功 . 当然没有返回类型的类型推导都是编译,但是涉及类型转换并且无法获得预期的结果 .
那么这是否表示一个铿锵声,或者是因为gcc扩展(关于c 11或c 14)?
1 回答
Clang的行为是正确的 . 这是一个GCC错误(并且演示文稿中的声明也不正确) . §3.3.2[basic.scope.pdecl] / p1,6:
§3.3.7[basic.scope.class] / p1说
trailing-return-types不在该列表中 .
尾部返回类型是声明符的一部分(§8[dcl.decl] / p4):
因此
sum
的可变版本不在其自己的trailing-return-type范围内,并且无法通过名称查找找到 .在C 14中,只需使用实际的返回类型推导(并省略尾随返回类型) . 在C 11中,您可以使用类模板和简单转发的函数模板: