逗号运算符与逗号表达式分隔符不同。
逗号运算符接受两个表达式,计算左侧,丢弃它,计算右侧,并返回结果。
当您有一个表达式列表时使用表达式分隔符,例如函数调用或初始化列表。
decltype(a,b,c)
是decltype(
表达式)
,而不是decltype(
表达式列表)
。这意味着,
您的decltype
is 运算符逗号。
通常,...
扩展仅在语法允许表达式列表时才有效。“,
生成”是表达式分隔符,而不是逗号运算符。
我不知道您可以,
使用...
. 如果您不关心它们的评估顺序,您可以执行以下操作:
template<class T, class... Ts>
struct last_type_helper{using type=T;};
template<class T0, class T1, class... Ts>
struct last_type_helper<T0, T1, Ts...>:last_type_helper<T1, Ts...>{}
template<class... Ts>
using last_type=typename last_type_helper<Ts...>::type;
template<class T0>
T0&& last_expression( T0&& t0 ) { return std::forward<T0>(t0); }
template<class T0, class...Ts>
auto last_expression( T0&& t0, Ts&&...ts )->last_type<T0, Ts...>&& {
return last_expression( std::forward<Ts>(ts)... );
}
然后
template<class...Args>
auto g(Args&&...args) -> decltype(last_expression(args...));
工作,一样
template<class...Args>
auto g(Args&&...args) -> last_type<Args...>;
把车放在马后面,不是吗?