On Friday, 19 April 2013 at 12:43:49 UTC, Piotr Szturmaj wrote:
What about this:
auto inferReturnTypeAndAttributes() { ... }
auto(return) inferOnlyReturnType() { ... }
or since all attributes are constraints, it can be rewritten to:
auto inferOnlyReturnType() pure nothrow @safe { ... }
It really doesn't make sense to infer impurity, throwing or
unsafety because these are the default.
I imagine there are some use cases where programmer for example
wants to infer all but purity, possibly because some other part
of the code relies on pure behavior of his function, and he
doesn't care about the other attributes. Example of pure
function where nothrow and safety are inferred:
auto inferAllButPurity() pure { ... }
To sum up:
1. auto - infers all
2. auto(return) - infers only a return type
3. auto fn() attrs... - infers return type and all not
specified attributes
Second and third are equivalent, thus auto(return) is optional.
There were some voices about breaking overriden functions by
adding/inferring superclass function attribute. I think this is
an oversight, virtual functions should not have attributes
inferred.
Except for 2, this is already what is proposed.
As of for 2 I'd rather have a standard way to have attribute
binding to the return type or the declaration. This is a
recurring problem, and auto is simply one instance of it.
auto applied to the return type means that we infers the return
type, applied to the function it means infers return type AND
attributes.