template<class C, class F>
auto test(C c, F f) -> decltype((void)(c.*f)(), void()) { }
逗号表达返回最右边的类型
You are looking at , which is an operator in C++ (comma operator). See row 16
Its declaration may looks like this: T2& operator,(const T& a, T2& b);
So a, b, c is evaluate as ((a,b),c), (b,c), (c), which returns a reference to the return type of c (a, b, c can be expressions)
In your case 1, i returns a reference to the last term, i. Hence the type is int&, so decltype(1, i) var = i; becomes int& var = i;
(i) is an expression, and it has return value which is a reference to i (int&)