После довольно долгого перерыва я снова пишу на С++ (если не полный рабочий день, то половину точно). До этого последний раз такое было ещё в институте, году в 2007. Язык с тех пор сильно поменялся, ну, и писал я на нём в институте так себе, в духе «C с классами». Как выяснилось, С++ вообще очень даже неплохой язык, но чего я не могу понять, так это почему там такие странные дефолты. (Я, конечно, лукавлю; понятно, что они взялись из-за совместимости с C и другого исторического багажа).
- на чём спотыкаюсь больше всего:
MyClass *obj
— это опциональное значение. Для того, чтобы оно было неопциональным, надо совершать дополнительные приседания в виде типа-обёртки с удалённым конструктором по умолчанию, типаRequired<MyClass *> obj
- а, вот, кстати — конструкторы по умолчанию для всех типов. Зачем давать возможность сконструировать не(до)инициализированный объект?
auto
, конечно, радует, но почему по умолчанию это переменная? Не знаю, как у вас, но в коде, который я читаю и пишу, наверно, 90% переменных присваивается только один раз. Если убрать из этого случаи типаX x; if (condition) { x = ... } else { x = ... }
, думаю, будет уже 97–98%.- ладно локальные переменные, но формальные параметры функций-то почему переменные? По-хорошему, в подавляющем большинстве случаев я должен писать что-то в духе
B f(const A *a)
или дажеB f(const A * const a)
, но это же совсем невыносимо! - по умолчанию любая функция может бросить исключение, а для того, чтобы сказать обратное, мне надо дополнительно писать
nothrow
. Но это же поэтому и назвали исключением, м?
Объединяющая мысль у этих примеров — чтобы добиться того поведения, которого я хочу в 95% случаев, надо писать больше, а это лень и забываешь. И главное, вроде, это и не даёт никакого выигрыша в производительности, даже наоборот — компилятор мог бы лучше соптимизировать, если бы знал, что тут всё константы или нет исключений. И ошибок по невнимательности было бы меньше.
В общем, загадка. Зато variadic templates есть, что мощь, конечно.