Make associated types Sized by default


#1

Currently this program:

#![feature(associated_types)]
trait A {
    type T;
    fn foo(&self) -> <Self as A>::T;
    fn bar(&self) -> <Self as A>::T { self.foo() }
}
fn main() {}

Fails to compile as:

1.rs:5:39: 5:49 error: cannot move a value of type T: the size of T cannot be statically determined [E0161]
1.rs:5     fn bar(&self) -> <Self as A>::T { self.foo() }
                                             ^~~~~~~~~~

According to RFC 59 we should be able to fix it by (currently unimplemented)

trait A {
    type T : Sized;
    ...
}

But,

  1. Shouldn’t associated types be Sized by default? As associated types are to be used to replace “output” type parameters, it is more convenient to be Sized.

  2. If associated types are Sized by default, what should be the syntax then if we want to allow unsized associated types? The generic spelling currently suggests something like

     type Sized? T;

#2

Good catch – can you please file this as an issue on the github rust repository?


#3

Thanks. Filed as https://github.com/rust-lang/rust/issues/17921.