Почему "auto const &" не доступен для чтения?

#include <tuple>

int main()
{
    int xa = 1;
    int ya = 2;

    auto const& [xb, yb] = std::tuple<int&, int&>(xa, ya);

    xb = 9; // Shouldn't this be read-only?

    return xa + ya;
}

Это не только компилируется, но и возвращает 11.

Итак, два вопроса:

  1. Почему я могу писать в xb, когда он указан как auto const &? Разве это не может скомпилироваться?

  2. Почему я не могу заменить "auto const &" на "auto &" и скомпилировать? Как Clang (6.0), так и g++ (7.3) жалуются на сообщение об ошибке, такое как "ссылка на не-const laleue типа <...> не может привязываться к временному типу tuple <...>

Спасибо!

Ответ 1

  1. Вы получаете ссылку const на кортеж неконстантных ссылок на ints. Затем вы разбиваете этот кортеж на две неконстантные ссылки. Чтобы сделать int ссылки const, вам нужно сделать int ссылки const:

    auto const& [xb, yb] = std::tuple<const int&, const int&>(xa, ya);
    
  2. Кортеж, который вы создаете, является неназванным временным, поэтому вы не можете привязывать к нему неконстантную ссылку, хотя эта ссылка сама по себе не называется.