If you have something like
let foo = Foo::foo();
the compiler translates this to
let foo: Foo();
foo.foo();
i.e. all struct constructors would implicitly and necessarily use in-place construction.
As for fields on Foo, if you have something like:
struct Foo {
bar: u16,
}
impl Foo {
fn foo(&mut self() -> Self, bar: i32) {
self.bar = bar;
}
}
You’d be forced to have that “self.bar = bar” (or self.bar = something_else) line in the constructor.