auto и const

Еще неочевидная проблема. Реализована два метода получения объекта по индексу — At. Оба возвращают ссылку. Один константный возвращает константную ссылку, потому, что есть константные методы, из которых нельзя вызывать не константные методы. Второй — для редактирования. Возвращает ссылку которую можно редактировать.

Есть код:

auto object = At(x, y);

object.field = <какое-то значение>;

At, по умолчанию, возвращает константное значение. Присвоение отрабатывает, но изменение не происходит. И ни один компилятор ни на что не ругается.

Почему не предупредить, что объект константный и нельзя менять значение его полей? Почему не выдать ошибку? Исключение? Хоть что-то?!

Да, проблема решается просто:

Object& object = At(x, y);

Но надо же еще найти, что проблема в этом!

Вывод один: auto — Зло. Ну или не зло, но за ним надо смотреть в оба глаза.

Контейнеры и ссылки

Начал переписывать свой проект со swift на C++ и посыпались проблемы, от которых я уже отвык. Начнем по порядку.

В С++ невозможно сделать массив ссылок. Ни массив, ни контейнер из STL ссылки не поддерживают.

Объекты достаточно большие, копировать их не хочется. В классы передаются ссылками. Морочится с указателями, new и delete не вдохновляет. Что делать?

Берем smart_ptr. Начинаются проблемы. В smart_ptr нельзя обернуть this. Точнее можно, при условии если унаследовать специальный класс, если гарантировать, что объект создан через smart_ptr.

То есть, использовать smart_ptr везде нельзя. Остается зоопарк из ссылок и smart_prt.

Делаем контейнер из smart_ptr и узнаем, что он не понимает иерархию классов. Надо вручную приводить добавляемый в контейнер объект к родительскому классу.

Получается вот такая сложная конструкция:

std::vector<std::shared_ptr<Object>> Objects;
someObject= std::make_shared<SomeObject>();
Objects.push_back(std::static_pointer_cast<Object>(someObject));

То же самое на Swift:

var objects = [Objects]()
let somObject = SomeObject()
objecs.append(someObject)

И никаких «;» «<>». При том, что мы сразу получаем массив ссылок. Объекты не копируются и не надо городить над ними ничего лишнего.