See also: my strawman proposal from the other thread, for a trait that would allow function call arguments to be constructed in place, as a supplement to guaranteed copy elision for assignments, returns, etc., as proposed here. This would allow plain old container.push(Foo::try_new(5)?);
to do the right thing.