Должен ли компилироваться следующий код?
Это не так.Это ошибка MSVC.
Декларация структурированной привязки вводит новое имя (только для спецификации), e
, которое объявляется как:
auto e = x;
Тип e
называется E
, и поскольку инициализатор подобен кортежу, типы привязок задаются как tuple_element_t<i, E>
.В этом случае E
равно pair<int, int>
, поэтому два типа просто int
.Правило для decltype
структурированной привязки - указывать ссылочный тип , поэтому decltype(a)
и decltype(b)
равны int
.
Важной частью здесь является то, что a
и b
(структурированные привязки) происходят из изобретенной переменной (e
), а не - ее инициализатор (x
),e
не const
, потому что вы только что объявили auto
.Мы копируем x
, а затем привязываемся к этой (не const
) копии.