Решил проверить, вдруг со времён С++98/03 что-то поменялось и язык стал вменяемым языком, а не набором костылей.
Спиратил Effective Modern C++ Мейерса. Дочитал до 6-го item'а. Там облом с auto: возвращается прокси-объект вместо ожидаемого программистом типа. Как обойти? (барабанная дробь) ЯВНЫМ ПРИВЕДЕНИЕМ ТИПА!
Нафига нужен тогда auto, если от явного приведения типа никуда не деться?
Сейчас фанбои закудахтают что мол «ну это же исключение, обычно auto ведёт себя так как надо». Предлагаю им представить типичную ситуацию в проэкте на 99M loc: объект возвращал что-то такое, что было совместимо с нашими представлениями и убогим type inference и мы использовали auto и ни о чём не думали. А потом решили для оптимизации или чего ещё заменить возвращаемое значение на прокси.
Что предложат нам фанбои? Перелопачивать 99M loc и явно кастовать/заменять auto на нужный тип?
Ладно, не шмагли запилить нормальный type inference, как в человеческих языках семейства ML. Ну могли бы запилить что-нибудь вроде оператора приведения к auto:
class ProxyClass {
operator auto() { return ExpectedType; }
}
Конечно, теперь нам нужен костыль для случая когда мы хотим, чтобы auto выводилось не в ExpectedType, а в ProxyClass. Но это меньшее зло: этот костыль будет нужен только в ограниченном объёме кода и с ним будет работать малое число посвящённых, вроде написателей библиотеки. Огромные же пласты пользовательского кода будут безболезненно и незаметно переносить замену ExpectedType на ProxyClass и обратно.
Ладно, я тут со своими рационализаторскими предложениями отклонился от главной мысли. Прошёл десяток лет. Вышли новые стандарты. Но язык по прежнему остался кривым и убогим нагромождением правил и исключений (одно из которых я привёл выше). Затхлым прудом, под тиной которого скрыты завалы подводных камней. И с новым стандартом камней стало только больше.
Есть что-то иезуитское в названиях вида «Effective C++», когда в самой книге описываются методы как при движении по полю не подорваться на минах, которые рандомно разбросали полоумные создатели стандарта. Можно ли «эффективно» (быстро) двигаться по минному полю и не подрываться? Нет, это взаимоисключающие параграфы.
На C++ можно писать либо эффективно и проект быстро станет бажным и дорогим в поддержке. Можно писать корректно, что значит сверять каждую введённую строчку с кучей правил и исключений в страхе ошибиться в каких-то предположениях — то есть писать медленно и опять же дорого.
Плюсодрочеры, начинайте каяться!