Hi,
unless I am missing something, the problem with optimal object construction with user-defined constructor is still unsolved in your proposal.
I.e.
when we have an aggregate:
struct Foo
{
Bar1 a;
Bar2 b;
};
Following expression is optimal w.r.t. construction (no copy/moves for Bar1/Bar2) thanks to aggregate initialization:
Foo f = { Bar1{...}, Bar2{...} }; // #1
But if user-defined constructor is provided, then there is no way to achieve optimal construction with same initialization expression as in #1.
struct Foo
{
Foo(Bar1 a, Bar2 b) #2
: a(std::move(a)), b(std::move(b))
{}
Foo(const Bar&1 a, const Bar2& b) #3
: a(a), b(b)
{}
Bar1 a;
Bar2 b;
};
You get a temporary construction, and either move(#2) or copy(#3) + temporary destruction.
Ultimate copy ellision, should relax rules of copy elision so that any copy/moves of constructor arguments into object members/bases is allowed as well.
So that the most simple constructor definition is always optimal:
struct Foo
{
Foo(Bar1 a, Bar2 b)
: a(a), b(b)
{}
Bar1 a;
Bar2 b;
};
Regards,
Maciej