Почему "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.
Итак, два вопроса:
-
Почему я могу писать в xb, когда он указан как auto const &? Разве это не может скомпилироваться?
-
Почему я не могу заменить "auto const &" на "auto &" и скомпилировать? Как Clang (6.0), так и g++ (7.3) жалуются на сообщение об ошибке, такое как "ссылка на не-const laleue типа <...> не может привязываться к временному типу tuple <...>
Спасибо!
Ответы
Ответ 1
-
Вы получаете ссылку const на кортеж неконстантных ссылок на ints. Затем вы разбиваете этот кортеж на две неконстантные ссылки. Чтобы сделать int ссылки const, вам нужно сделать int ссылки const:
auto const& [xb, yb] = std::tuple<const int&, const int&>(xa, ya);
-
Кортеж, который вы создаете, является неназванным временным, поэтому вы не можете привязывать к нему неконстантную ссылку, хотя эта ссылка сама по себе не называется.