It seems necessary to allow a struct tuple constructor on structs if we implement overloading. Here is the reason:
When refactoring an overloaded function that one wants to call with named parameters, one can combine an enum that wraps a structure, for example:
slice(&self, from: uint = 0, to: uint = self.len()) { ... }
slice(&self) { self.slice(..) }
// Works with overloading and named argument syntax
foo.slice();
foo.slice(0, 10);
foo.slice(start: 0, ..);
When we refactor, we have to pick either unnamed or named argument syntax, because struct tuples only support unnamed while structs only support named.
struct Range { from: Option<uint>, to: Option<uint> }
fn slice(&self, Some(Range { from = 0, to = self.len() }) { ... }
fn slice(&self, None) { ... }
foo.slice(); // Works as before
foo.slice(0, 10); // ERROR: This function uses named arguments
// Desugars into Some(Range { from: Some(0), to: None })
foo.slice(start: 0, ..);
We need the tuple constructor for structs to avoid error. This could be implemented manually by writing a function Foo that constructs Foo.