| |
| Posted by H. S. Teoh in reply to WhatMeWorry | PermalinkReply |
|
H. S. Teoh
Posted in reply to WhatMeWorry
| On Thu, Jan 27, 2022 at 05:42:09PM +0000, WhatMeWorry via Digitalmars-d-learn wrote:
> While studying Ali's book at chapter "Constructor and Other Special Functions" and the below code snippet:
[...]
> // Original
> //this(int i) const { writeln("a const object"); }
> //this(int i) immutable { writeln("an immutable object"); }
> //this(int i) shared { writeln("a shared object"); }
>
> const this(int i) { writeln("a const object"); }
> immutable this(int i) { writeln("an immutable object"); }
> shared this(int i) { writeln("a shared object"); }
[...]
> Assuming I can speak in correct programmer-ese: I was wondering why the qualifiers were placed after the function parameter list (int i). Just for fun, I moved to type qualifiers before the function definitions "this" (like a return type?) and the output was exactly identical. So I guess my question is, is this just a matter of esthetics or is some more nuanced goal at work here?
In method declarations, modifiers like const/immutable/shared play two distinct roles:
1) Qualifying the return type of the method;
2) Qualifying the implicit `this` parameter of the method.
Historically, D has been rather lax about where qualifiers in the sense
of (2) can go, so that's why:
const this()
is the same as
this() const
They both mean that the implicit `this` parameter (not to be confused with `this` as the name of the ctor) is const.
Personally, though, I prefer the 2nd form, because the first form could potentially be ambiguous in non-ctor member functions:
struct S {
const int method();
}
Does the const apply to `int` or to the implicit `this` parameter? It's not obvious. Better to write it this way:
int method() const; // const applied to `this`
const(int) method(); // const applied to return type
N.B. the parentheses in `const(int)` -- while D is lax in allowing you to write `const int`, that leads to the ambiguous situation above. My personal recommendation is to always parenthesize qualified types so that they are never ambiguous.
T
--
Mediocrity has been pushed to extremes.
|