Interesting question.
Correcting my first interpretation, it seems to me that is g++ and clang++ are right and that MSVC is wrong.
I suppose this because in the draft n4659 for C++17 (sorry: I don't have access at the final version) I see the expression rules (A.4) where the division operator is involved in a "multiplicative-expression" rule as follows
multiplicative-expression / pm-expression
A "multiplicative-expression" can be also a "pm-expression" that can be a "cast-expression" that can be an "unary-expression" that can be a "postfix-expression" that can be a "primary-expression" that can be a "fold-expression"
So the rule can be seen as
fold-expression / pm-expression
So, If I'm not wrong, a "fold-expression" should be evaluated as a whole before the division is applied.
My first interpretation (MSVC right, g++ and clang++ wrong) was based over an hasty lecture of 17.5.3
The instantiation of a fold-expression produces:
(9.1) ((E1 op E2) op ···) op EN for a unary left fold
and 8.1.6
An expression on the form (... op e) where op is a fold-operator is called a unary left fold.
So I supposed that
return (... + values) / static_cast<double>(sizeof...(Ts));
should be instantiated
return ((v1 + v2) + ... ) + vn / static_cast<double>(sizeof...(Ts));
Anyway... right MSVC or not... to be sure... of you want
return (1 + 3) / 2.0;
I suggest you to add another couple of parentheses.