Учитывая определение типа A:
struct A { int i; };
В соответствии со спецификацией [expr.ref] (я использовал n4618):
(если
E2не ссылается,)... ЕслиE1является lvalue, тоE1.E2является lvalue; иначеE1.E2- это значение x...
очевидно A{}.i - значение x;
также учитывая, что [dcl.type.simple]:
(для
decltype(e),) -... ife- это несферированное id-выражение или unparenthesized доступ к члену класса... - в противном случае, еслиeявляется значением x, decltype (e) является T & &, где T является типомe
поэтому decltype( ( A{}.i ) ) должен давать int &.
Однако я пробовал GCC5.1 и Clang3.9, они дают int, а vs2015u3 дает int &. Что правильно?