Структурированная привязка к const

Предполагается ли компилировать следующий код?

#include <type_traits>

void foo() {
  const std::pair<int, int> x = {1, 2};

  auto [a, b] = x;

  static_assert(std::is_const_v<decltype(a)>);
  static_assert(std::is_const_v<decltype(b)>);
}
  • MSVC отвечает "да!".
  • GCC говорит: "О нет, чувак!".
  • Clang говорит "ни за что!".

Итак, это ошибка MSVC?

Стандарт здесь не так прост (я бегло просмотрел), но, учитывая правила для auto, я полагаю, что a и b следует копировать, отбрасывая cv-qualifier.


person BiagioF    schedule 24.03.2019    source источник


Ответы (2)


Предполагается ли компилировать следующий код?

Нет. Это ошибка 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) копию.

person Barry    schedule 24.03.2019

Статические утверждения в вашем коде должны завершаться ошибкой. Почему? Потому что ваш код в основном такой же, как и в случае:

#include <type_traits>

void foo() {
  const int x_1 = 1;
  const int x_2 = 2;

  auto a = x_1;
  auto b = x_2;

  static_assert(std::is_const_v<decltype(a)>);
  static_assert(std::is_const_v<decltype(b)>);
}

который действительно не работает и на MSVC.

В C++ типы выражений распадаются при присваивании: auto видит int, а не const int. Структурированная привязка просто позволяет выполнять более одной auto привязки за раз.

... и поэтому тот факт, что MSVC не терпит неудачу с утверждениями в вашем коде, кажется ошибкой.

person einpoklum    schedule 24.03.2019