Нет. Объекты не должны знать, откуда они используются, чтобы работать. Что касается х, это экземпляр T. Вот и все. Он не ведет себя по-разному в зависимости от того, является ли он членом класса C, членом класса D, автоматическим, временным и т. Д.
Кроме того, даже если конструктор T знал об экземпляре C, этот экземпляр C был бы неполным, поскольку, конечно, он еще не закончил построение, поскольку его члены не были построены. C ++ предлагает вам много шансов выстрелить себе в ногу, но предложить вам ссылку на неполный объект в конструкторе другого класса не входит в их число.
Единственное, что я могу придумать, чтобы приблизить ваш пример кода, это сделать что-то вроде
#define INIT_FIELDS field1(this), field2(this), field3(this)
сразу после списка полей, затем используйте INIT_FIELDS в списке инициализатора и #undef его. Это все еще дублирование, но, по крайней мере, все это в одном месте. Однако это, вероятно, удивит ваших коллег.
Другой способ убедиться, что вы не забыли поле, - удалить конструктор с нулевым аргументом из поля. Опять же, вам все равно придется печатать, но, по крайней мере, если вы забудете что-то, компилятор поймает это. Я думаю, что не-СУХАЯ природа списков инициализаторов - это то, с чем C ++ просто должен жить.