Почему "auto const &" не доступен для чтения? [Дубликат]

user5406764 спросил: 28 марта 2018 в 01:41 в: c++

В этом вопросе уже есть ответ:

  • Variables marked as const using structured bindings are not const 1 ответ
#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 & amp ;? Должно ли это не скомпилироваться?

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

  3. ол> Спасибо!

1 ответ

Есть решение
Chris Dodd ответил: 28 марта 2018 в 03:29
  1. Вы получаете постоянную ссылку на кортеж неконстантных ссылок на целые. Затем вы разбиваете этот кортеж на две неконстантные ссылки. Чтобы сделать ссылки на int const, вам нужно сделать ссылки на int const:

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