With appropriate syntax, perhaps a user-defined constructor could be used in addition to designated/aggregate initialization? A constructor with a member initializer for each member followed by a body is similar to a designated initializer construction followed by a method call, perhaps that could be fused into a single statement? For example:
struct S {
int a;
S(int a) : a(a) { std::cout << "constructed an S instance: " << a << std::endl; };
};
int main() {
S s(1);
};
could be equivalent to
struct S {
int a;
S() /* some tag that designates this constructor as "the aggregate/designated initializer constructor" */ { std::cout << "constructed an S instance: " << a << std::endl; };
};
int main() {
S s = S{.a = 1};
};
In other words, adding the appropriate tag to a constructor means a) this class supports designated/aggregate initialization despite whatever other special member functions, and b) when designated/aggregate initialization is used, the body of this constructor is executed after all members are initialized (note: this would imply that the tagged constructor must have no arguments and no member initializers of its own, otherwise compile error).
Base class initialization in case of inheritance seems like it should work "fine", the existing mechanisms for designated/aggregate initializing base classes seems like they should follow naturally.