Jump to page: 1 2
Thread overview
Classes and @disable this()
Feb 08, 2015
fra
Feb 08, 2015
fra
Feb 08, 2015
Rene Zwanenburg
Feb 08, 2015
bearophile
Feb 08, 2015
Jonathan M Davis
Feb 09, 2015
Marc Schütz
Feb 09, 2015
Jonathan M Davis
Feb 10, 2015
Jonathan M Davis
Feb 10, 2015
Marc Schütz
Feb 10, 2015
Jonathan M Davis
Feb 10, 2015
bearophile
February 08, 2015
I just realized that you cannot define a disabled "default" constructor for classes: writing code like this will give a linker error

class Something
{
February 08, 2015
On Sunday, 8 February 2015 at 16:22:36 UTC, fra wrote:
Missclick... Anywya:
class Something
{
   @disable this();
   this(int i) {}
}

produces an undefined reference error.

I guess it has to do with classes implicitly inheriting from Object, and Object defining a this(), and @disable telling the compiler not to produce code for the given function.

However making it a compiler error would be far, far better then getting the linker error. In my case, the mangled name was 100% unintelligible (the usual "_ctor" was nowhere to be found, probably due to the class name being so long that it was getting shortened in some way)
February 08, 2015
On Sunday, 8 February 2015 at 16:28:21 UTC, fra wrote:
> On Sunday, 8 February 2015 at 16:22:36 UTC, fra wrote:
> Missclick... Anywya:
> class Something
> {
>    @disable this();
>    this(int i) {}
> }
>
> produces an undefined reference error.
>
> I guess it has to do with classes implicitly inheriting from Object, and Object defining a this(), and @disable telling the compiler not to produce code for the given function.
>
> However making it a compiler error would be far, far better then getting the linker error. In my case, the mangled name was 100% unintelligible (the usual "_ctor" was nowhere to be found, probably due to the class name being so long that it was getting shortened in some way)

No need to use @disable this(); A default constructor will only be generated when you don't define a constructor yourself.
February 08, 2015
fra:

> However making it a compiler error would be far, far better

I think this can be filed in Bugzilla as diagnostic enhancement:


class Foo {
    @disable this();
    this(int i) {}
}
void main() {}

Bye,
bearophile
February 08, 2015
On Sunday, February 08, 2015 17:51:09 bearophile via Digitalmars-d-learn wrote:
> fra:
>
> > However making it a compiler error would be far, far better
>
> I think this can be filed in Bugzilla as diagnostic enhancement:
>
>
> class Foo {
>      @disable this();
>      this(int i) {}
> }
> void main() {}

The compiler should probably just give you an error telling you that disabling the default constructor on classes is illegal. And since no default constructor is automatically declared if you declare another constructor, there isn't even any point in disabling the default constructor (which is probably why no one has been complaining about this). @disable this() only makes sense on structs.

- Jonathan M Davis

February 09, 2015
On Sunday, 8 February 2015 at 19:57:28 UTC, Jonathan M Davis wrote:
> On Sunday, February 08, 2015 17:51:09 bearophile via Digitalmars-d-learn wrote:
>> fra:
>>
>> > However making it a compiler error would be far, far better
>>
>> I think this can be filed in Bugzilla as diagnostic enhancement:
>>
>>
>> class Foo {
>>      @disable this();
>>      this(int i) {}
>> }
>> void main() {}
>
> The compiler should probably just give you an error telling you that
> disabling the default constructor on classes is illegal. And since no
> default constructor is automatically declared if you declare another
> constructor, there isn't even any point in disabling the default constructor
> (which is probably why no one has been complaining about this). @disable
> this() only makes sense on structs.

Alternatively, it could be accepted (and a no-op) if another constructor is defined, but an error if not.
February 09, 2015
On 2/8/15 2:57 PM, Jonathan M Davis via Digitalmars-d-learn wrote:
> On Sunday, February 08, 2015 17:51:09 bearophile via Digitalmars-d-learn wrote:
>> fra:
>>
>>> However making it a compiler error would be far, far better
>>
>> I think this can be filed in Bugzilla as diagnostic enhancement:
>>
>>
>> class Foo {
>>       @disable this();
>>       this(int i) {}
>> }
>> void main() {}
>
> The compiler should probably just give you an error telling you that
> disabling the default constructor on classes is illegal. And since no
> default constructor is automatically declared if you declare another
> constructor, there isn't even any point in disabling the default constructor
> (which is probably why no one has been complaining about this). @disable
> this() only makes sense on structs.

Why? I think it's perfectly acceptable.

What should be illegal is if you extend Foo and don't @disable this on the derivative.

-Steve

February 09, 2015
On Monday, February 09, 2015 13:29:22 Steven Schveighoffer via Digitalmars-d-learn wrote:
> On 2/8/15 2:57 PM, Jonathan M Davis via Digitalmars-d-learn wrote:
> > On Sunday, February 08, 2015 17:51:09 bearophile via Digitalmars-d-learn wrote:
> >> fra:
> >>
> >>> However making it a compiler error would be far, far better
> >>
> >> I think this can be filed in Bugzilla as diagnostic enhancement:
> >>
> >>
> >> class Foo {
> >>       @disable this();
> >>       this(int i) {}
> >> }
> >> void main() {}
> >
> > The compiler should probably just give you an error telling you that disabling the default constructor on classes is illegal. And since no default constructor is automatically declared if you declare another constructor, there isn't even any point in disabling the default constructor (which is probably why no one has been complaining about this). @disable this() only makes sense on structs.
>
> Why? I think it's perfectly acceptable.
>
> What should be illegal is if you extend Foo and don't @disable this on the derivative.

Why would it we even allow it? What benefit is there? It's meaningless. @disable this(); is for disabling the init property on structs. Classes themselves have no init values - and their references have null as their init value.

The default constructor already follows sensible rules where it's not generated if another constructor is declared, and derived classes have to call a base class constructor if the base class doesn't have a default constructor.

- Jonathan M Davis

February 09, 2015
On 2/9/15 3:15 PM, Jonathan M Davis via Digitalmars-d-learn wrote:
> On Monday, February 09, 2015 13:29:22 Steven Schveighoffer via Digitalmars-d-learn wrote:
>> On 2/8/15 2:57 PM, Jonathan M Davis via Digitalmars-d-learn wrote:
>>> On Sunday, February 08, 2015 17:51:09 bearophile via Digitalmars-d-learn wrote:
>>>> fra:
>>>>
>>>>> However making it a compiler error would be far, far better
>>>>
>>>> I think this can be filed in Bugzilla as diagnostic enhancement:
>>>>
>>>>
>>>> class Foo {
>>>>        @disable this();
>>>>        this(int i) {}
>>>> }
>>>> void main() {}
>>>
>>> The compiler should probably just give you an error telling you that
>>> disabling the default constructor on classes is illegal. And since no
>>> default constructor is automatically declared if you declare another
>>> constructor, there isn't even any point in disabling the default constructor
>>> (which is probably why no one has been complaining about this). @disable
>>> this() only makes sense on structs.
>>
>> Why? I think it's perfectly acceptable.
>>
>> What should be illegal is if you extend Foo and don't @disable this on
>> the derivative.
>
> Why would it we even allow it? What benefit is there? It's meaningless.
> @disable this(); is for disabling the init property on structs. Classes
> themselves have no init values - and their references have null as their
> init value.
>
> The default constructor already follows sensible rules where it's not
> generated if another constructor is declared, and derived classes have to
> call a base class constructor if the base class doesn't have a default
> constructor.

Well, if I do this:

class C {}

I can do this:

new C();

Mechanisms to disable this are kind of awkward. I can define this() as private, but that doesn't help for intra-module calls.

static class C doesn't work.

It really is only useful in the case where you don't want to define a constructor. Which probably means -- you don't want to use a class anyway ;)

But for completeness, it seems like I should be able to have the option of disabling something the compiler does by default. Even if it's next to useless.

-Steve
February 10, 2015
> I think this can be filed in Bugzilla as diagnostic enhancement:
>
>
> class Foo {
>     @disable this();
>     this(int i) {}
> }
> void main() {}


https://issues.dlang.org/show_bug.cgi?id=14163

Bye,
bearophile
« First   ‹ Prev
1 2