Inferred return types

Timon Gehr timon.gehr at gmx.ch
Fri Jun 29 12:25:10 PDT 2012


On 06/29/2012 09:17 PM, Jacob Carlborg wrote:
> I just noticed that the return type of a function can be inferred
> without using a storage class:
>
>
> @property foo ()
> {
>      return "foo";
> }
>
> void main ()
> {
>      string str = foo;
> }
>
> Is that supposed to work?

Yes.

> The specification says:
>
> "If it does not already have a storage class, use the auto storage class."
>
> But @property is not a storage class. It seems I can put most of the
> attributes there instead of @property, both those with and without a @.
>

The spec (and the implementation as well) considers them to be storage
classes. I think the term 'storage class' should be retired.


> Second, it seems it's not possible to override a method with an inferred
> return type, as the example below shows:
>
> class Foo
> {
>      auto foo ()
>      {
>          return "Foo";
>      }
> }
>
> class Bar : Foo
> {
>      auto foo ()
>      {
>          return "Bar";
>      }
> }
>
> void main ()
> {
>      Foo f = new Bar;
>      writeln(f.foo());
> }
>
> Results in:
>
> Error: function main.Bar.foo of type () overrides but is not covariant
> with main.Foo.foo of type ()
>
> --
> /Jacob Carlborg

This is a bug I have run into as well, but I have missed to report it.


More information about the Digitalmars-d mailing list