Какой тип обозначается спецификатором decltype, выражение которого является членом временного объекта типа класса? - PullRequest
4 голосов
/ 16 мая 2019

Скажем, у нас есть следующее объявление:

struct S {
  int a;
};

Какой тип обозначается следующим спецификатором простого типа ? Это int или int&&?

decltype(S{}.a)

(Этот вопрос предназначен для решения C ++ 17, но ответы на другие версии стандарта также приветствуются.)

1 Ответ

4 голосов
/ 16 мая 2019

Это int. За [dcl.type.simple] / 4 :

Для выражения e тип, обозначенный decltype(e), определяется как следующим образом:

  • [...]

  • в противном случае, если e является не заключенным в скобки id-выражением или доступ к члену класса без скобок , decltype(e) является типом юридическое лицо, названное e. Если такой сущности нет или e имен набор перегруженных функций, программа некорректна;

  • [...]

Сущность, названная S{}.a, является a, которая имеет тип int. Следовательно, decltype(S{}.a) обозначает тип int. (Спасибо комментарий за указание на это!)


Как уже упоминалось в комментарии , хотя тип, обозначенный decltype(S{}.a), равен int, S{}.a является значением x и может быть привязан к int&&, как в:

int&& rv = S{}.a;
...