逗號運算符與逗號表達式分隔符不同。
逗號運算符有兩個表達式,評估左側,放棄它,評估右側並返回結果。
表達式分隔符用在有表達式列表時,如函數調用或初始化列表。
decltype(a,b,c)
是decltype(
表達)
,不decltype(
表達式列表)
。這意味着您的decltype
中的,
是運算符逗號。
一般而言,...
擴展只適用於語法允許列表的表達式。 「生成」,
是表達式分隔符,而不是逗號運算符。
我不知道您可以使用...
來模擬,
運算符的行爲,包括執行順序。如果你不關心他們正在評估以什麼順序,你可以這樣做:
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...>;
這使本末倒置後,不是嗎?
我相當確定這不是它的工作原理。包擴展不會給你一個逗號分隔符的表達式。它根據上下文爲你提供不同的列表。「根據擴展發生的位置,結果的逗號分隔列表是一種不同類型的列表:函數參數列表,成員初始化列表,屬性列表等。但從來沒有給你一個逗號運算符的表達。這不僅僅是像宏一樣的文本替換。 – PeterT 2014-10-31 19:22:03