Purity, @safety, etc., in generic code
Zach the Mystic
reachBUTMINUSTHISzach at gOOGLYmail.com
Tue Feb 19 08:57:32 PST 2013
On Tuesday, 19 February 2013 at 08:25:08 UTC, kenji hara wrote:
> I have said that "method const qualifier inference on class
> inheritance is
> bad".
>
> With 8138 or 8366, such inference suddenly add const qualifier
> to one of
> overloaded functions, and changes the meaning of overload list.
> More than
> worse, it may introduce newly relation between overloaded
> functions, and in
> the worst case, it will add new forward reference problem.
>
> class C : B // or class C(T)
> {
> void foo() { ... foo(10); ... }
> void foo(int n) { ... foo(); ... }
> }
>
> For pure/nothrow/@safe inference, if a mutual dependency is
> found, the
> attributes are inferred to impure/throwing/@system due to avoid
> forward
> reference issue.
> But, we cannot define such 'default qualifier' for const
> inference. So it
> must raise forward reference error if a mutual dependency is
> found. AND it
> will break existing valid code.
>
> And bug 8366 can allow to hijack derived class by base class.
> If a base
> class add const qualifier to its method, it affects to the
> overload list in
> its derived class, not only the method that directly overrides
> modified one.
>
> We should avoid language features that is hijacking/fwdref
> error prone.
>
> Kenji Hara
I have no reason not to trust your great experience on this
matter. Is syntax sugar a possible solution?
class A
{
bool foo(in Object o) inout { return true; }
}
... lowers to:
class A
{
bool foo(in Object o) { return true; }
bool foo(in Object o) const { return true; }
}
Or would that lead to extensive problems of its own?
More information about the Digitalmars-d
mailing list