Я читал через исходный код Clang и обнаружил что-то интересное в ARM С++ ABI, которое я, похоже, не понимаю для обоснования. Из онлайн-версии документации ARM ABI:
Этот ABI требует, чтобы конструкторы C1 и C2 возвращали это (вместо функций void), так что конструктор C3 может tail вызвать конструктор C1, а конструктор C1 может вызвать вызов C2.
(и аналогично для не виртуальных деструкторов)
Я не уверен, что здесь C1
, C2
и C3
здесь... этот раздел предназначен для модификации п. 3.1.5 из общей (то есть Itanium) ABI, но это (по крайней мере, в это онлайн-версия) просто говорится:
Конструкторы возвращают результаты void.
В любом случае, я действительно не могу понять, какова цель этого: как сделать возврат конструктора, это позволяет оптимизировать хвостовой вызов и при каких обстоятельствах?
Насколько я могу судить, единственный раз, когда конструктор мог бы вызывать другого с тем же возвратным значением this
, был бы случайным классом с одним базовым классом, тривиальным куском конструктора, без членов с не- тривиальные конструкторы и указатель виртуальной таблицы. На самом деле кажется, что было бы проще, а не сложнее, оптимизировать с помощью хвостового вызова с возвратом void
, потому что ограничение одного базового класса можно было бы исключить (в случае с несколькими базовыми классами this
, возвращаемый из последнего вызываемого конструктора, не будет указателем this
производного объекта).
Что мне здесь не хватает? Есть ли что-то в соглашении вызова ARM, которое делает возврат this
необходимым?