Потому что вы просто не можете.
Инициализатор членов конструктора предназначен для инициализации, ну, в общем, членов. Не выбранные члены участников. Это так просто. Просто нет возможности делать то, что вы хотите.
Может ли стандарт C ++ обеспечить такую вещь? Возможно. Но в целом это открыло бы все виды неприятных крайних случаев с полуинициализированными объектами, неясной семантикой и кошмарами безопасности исключений. (Что случилось бы с остальной частью объекта root
, если бы существовало больше? Как бы сам объект был инициализирован? Частично? Полностью? Когда?)
Все для абсолютно никакой выгоды.
Транзитивно вызываемые конструкторы делают инициализацию простой, понятной и всегда "принадлежащей" соответствующему объекту в коде.
Используйте собственные функции инициализации члена, точно так же, как во втором примере.