On Wednesday, 17 April 2013 at 07:04:16 UTC, Peter Alexander wrote:
Often enough. I often find myself returning ranges, which are almost invariably complex template types.

And, to be honest, I would just like to use auto without being locked into inferred attributes. It just feels wrong that these things should be conflated, and I get the feeling we will regret this later on when D starts to be used in larger projects.

Note that this is consistent with many choice D made.

auto is a storage class. storage class usually stick to the function, not the return type :
const Foo bar(); // Error as const qualify bar and not Foo.

auto is about type inference. Attribute is part of the function type as much as it return type, and so it is expected that auto applied to a function infer its attributes and its return type.

The problem you are talking about is very real, but much broader than this auto thing. The problem is that you have no control on what the storage classes bind on.

Examples :
extern(C) void function() foo; // does extern binds to foo, foo's type or both ? pure function() function() bar; // is bar a pure function ? is bar() pure ? Noth ? How to choose ?

Back to the subject, if auto bind to the function it must infers attributes, if it binds to the return type, it mustn't. And right now, storage class bind to the function.

Reply via email to