Здравствуйте, bazis1, Вы писали:
B>Минусы плюсов:
B>* Нет нормального garbage collector-а.
Есть консервативные сборщики мусора, причём им не первый десяток лет, но их никто не использует, потому что нет такой необходимости.
B>Поэтому нужно постоянно держать в голове, что и когда удаляется.
Нужно держать и что-то там разруливать в исключительных случаях, а никак не постоянно.
B>Всякие shared_ptr и т.п. частично эту проблему решают, но держать это в голове все равно придется.
99% случаев разруливаются scope-based lifetime, даже без всяких *_ptr и прочего ref-counting.
B>* Меньше синтаксического сахара. К примеру, вот такая строчка в C#
B>B>return m_Something?.SomethingElse?.SubSomething ?? "empty";
B>
Проблема с засильем null'ов это исключительно родовая травма C#. В C++ нет такой проблемы.
B>и таких примеров много. Соответственно, одинаковый по функционалу код получается более громоздким и дорогим в поддержке.
Это типа
4k строк нагенерированных на ровном месте?
B>* Нет reflection. В C# я могу объявить вот такую структуру:
B>B>struct MyStruct
B>{
B> int Score;
B> string[] Names;
B>}
B>
Для этого есть Boost.Fusion/Hana
BOOST_FUSION_DEFINE_STRUCT
(
(demo), MyStruct,
(int, Score)
(vector<string>, Names)
)
Но со встроенным compile-time reflection было бы конечно красивее.
B>* Нет yield return, async/await,
Во-первых есть библиотечные (например на базе Boost.Coroutine). А во-вторых если речь про MSVS — то там начиная с ЕМНИП 2015 есть встроенное расширение.
B>LINQ
Для in-memory последовательностей есть Boost.Range. А для взаимодействия с DB есть как отдельные библиотеки с декларативным описанием запросов, так и целые системы а-ля ODB.
B>* Существенно дольше компиляция, если Вы часто редактируете header-ы. Можно частично побороть через precompiled headers, но все равно будет медленно.
Здесь верно, да.