不应该.对象不应该知道它们在哪里被使用才能工作.就x而言,它是T的一个实例.就是这样.根据它是C类的成员,D类的成员,自动,临时等,它的行为不同.
此外,即使T构造函数确实知道C的实例,C的实例也是不完整的,因为它当然还没有完成构造,因为它的成员还没有被构造.C++为你提供了很多机会射击自己,但是在另一个类的构造函数中提供一个不完整对象的引用并不是其中之一.
我能想到的唯一能够近似你的代码示例的是做类似的事情
#define INIT_FIELDS field1(this), field2(this), field3(this)
紧接在字段列表之后,然后在初始化列表中使用INIT_FIELDS并#undef它.它仍然是重复,但至少它在一个地方.但是,这可能会让您的同事感到惊讶.
另一种确保不忘记字段的方法是从Field中删除零参数构造函数.同样,您仍然需要进行输入,但至少如果您忘记了编译器将捕获它的内容.我认为,初始化程序列表的非DRY特性是C++必须要使用的东西.
不应该.对象不应该知道它们在哪里被使用才能工作.就x而言,它是T的一个实例.就是这样.根据它是C类的成员,D类的成员,自动,临时等,它的行为不同.
此外,即使T构造函数确实知道C的实例,C的实例也是不完整的,因为它当然还没有完成构造,因为它的成员还没有被构造.C++为你提供了很多机会射击自己,但是在另一个类的构造函数中提供一个不完整对象的引用并不是其中之一.
我能想到的唯一能够近似你的代码示例的是做类似的事情
#define INIT_FIELDS field1(this), field2(this), field3(this)
紧接在字段列表之后,然后在初始化列表中使用INIT_FIELDS并#undef它.它仍然是重复,但至少它在一个地方.但是,这可能会让您的同事感到惊讶.
另一种确保不忘记字段的方法是从Field中删除零参数构造函数.同样,您仍然需要进行输入,但至少如果您忘记了编译器将捕获它的内容.我认为,初始化程序列表的非DRY特性是C++必须要使用的东西.