On Tuesday, 13 September 2022 at 14:16:39 UTC, Ali Çehreli wrote:
> On 9/12/22 09:39, Paul Backus wrote:
> Yes. Except for @trusted
, explicit attributes on template
code are a
smell.
Except for 'const' as well because some templates are member functions. And 'const' on a member function cannot be left to inference because it happens to be a part of the type of the function, which can be overloaded.
Yes, good point. In my head, I think of attributes that apply to the this
parameter like const
, inout
, shared
, and so as being in a separate category from attributes that apply to the function itself, like @safe
and @trusted
.
> Somebody needs to create a two dimensional table that shows what it means for each function attribute on a regular function, member function, and templates of those, and hopefully come up with some guidelines.
Here's my attempt, covering all the attributes found under MemberFunctionAttribute
in the language spec:
Attribute |
Affects |
Inferred? |
nothrow |
Function |
Yes |
pure |
Function |
Yes |
@nogc |
Function |
Yes |
@safe |
Function |
Yes |
@system |
Function |
Yes |
@trusted |
Function |
No |
@property |
Function |
No |
@disable |
Function |
No |
const |
this |
No |
immutable |
this |
No |
inout |
this |
No |
shared |
this |
No |
return |
this |
Yes |
scope |
this |
Yes |
In general, attributes with a 'Yes' in the 'Inferred?' column should not be applied explicitly to functions that are subject to attribute inference. This includes functions defined inside templates, as well as nested functions and functions with an inferred return type (i.e., auto
functions).