Daily bit(e) C++. std::views::as_const
Добавлено 23 октября 2026 в 03:36
Daily bit(e) C++ 155, представление std::views::as_const из C++23, делающее данные неизменяемыми.

Один из недостатков стандартных представлений – их поведение в том случае, если они помечены как const.
Как это часто бывает с типами, работающими по ссылке, представления не учитывают модификатор const. Более того, некоторые комбинации представлений и диапазонов требуют возможности изменения данных.
Благодаря std::views::as_const, появившемуся в C++23, мы можем сохранить возможность изменения самого представления, при этом гарантируя неизменяемость лежащих в его основе данных.
#include <ranges>
#include <vector>
#include <list>
std::vector<int> rnd_acc{1,2,3,4,5,6};
std::list<int> bidir{1,2,3,4,5,6};
const auto v1 = rnd_acc | std::views::drop(1);
auto x1 = *v1.begin(); // OK
*v1.begin() = 42; // Тоже OK (не соблюдая const)
const auto v2 = bidir | std::views::drop(1);
// auto x2 = *v2.begin();
// Не скомпилируется: views::drop требует возможности изменения
// данных при работе с диапазонами, не поддерживающими
// произвольный доступ.
auto cview1 = rnd_acc | std::views::as_const | std::views::drop(1);
auto cview2 = bidir | std::views::as_const | std::views::drop(1);
auto y1 = *cview1.begin(); // OK
auto y2 = *cview2.begin(); // OK
// *cview1.begin() = 42;
// Не скомпилируется, не может изменить данные через
// константную ссылку.
