Пропуск конструкторов копирования и перемещения



Недавно был опубликован пост про RVO/NRVO. Какой еще можно сделать вывод из этой статьи?



Конструкторы копирования/перемещения не всегда могут быть вызваны! И если вы туда засовываете, например, какие-то счетчики, которые должны влиять на внешний код, то будьте готовы, что они могут остаться нетронуты.



Вообще говоря, никогда не стоит определять никаких сайд эффектов в конструкторах / деструкторах / операторах, если вы на них рассчитываете. Иначе может случиться вот это.



Конечно же, такую оптимизацию можно отменить с помощью флага компиляции:

-fno-elide-constructors




Тогда всё всегда будет вызываться, но при этом с потерей производительности. С другой стороны, это в принципе кажется странным — конструкторы не должны менять ничего снаружи себя. Соблюдайте это правило, и всё будет хорошо!



#cppcore #algorithm #hardcore