clear()

Denis Koroskin 2korden at gmail.com
Sat Oct 10 03:06:16 PDT 2009


On Sat, 10 Oct 2009 13:08:01 +0400, Max Samukha <spambox at d-coding.com>  
wrote:

> On Fri, 09 Oct 2009 21:50:48 +0200, Yigal Chripun <yigal100 at gmail.com>
> wrote:
>
>> On 09/10/2009 19:53, Max Samukha wrote:
>>> On Fri, 09 Oct 2009 11:40:43 -0500, Andrei Alexandrescu
>>> <SeeWebsiteForEmail at erdani.org>  wrote:
>>>
>>>> I'm talking with Sean and Walter about taking the first step towards
>>>> eliminating delete: defining function clear() that clears the state of
>>>> an object. Let me know of what you think.
>>>>
>>>> One problem I encountered is that I can't distinguish between a  
>>>> default
>>>> constructor that doesn't need to exist, and one that was disabled
>>>> because of other constructors. Consider:
>>>>
>>>> class A {}
>>>> class B { this(int) {} }
>>>>
>>>> You can evaluate "new A" but not "new B". So it's legit to create
>>>> objects of type A all default-initialized. But the pointer to
>>>> constructor stored in A.classinfo is null, same as B.
>>>>
>>>> Any ideas?
>>>>
>>>
>>> The notion of default constructor is not quite clear.
>>>
>>> class A
>>> {
>>>    this(int a = 22) {}
>>> }
>>>
>>> Should A be considered as having a default constructor?
>>>
>>> class B
>>> {
>>>    this(int) {}
>>> }
>>>
>>> Should passing int.init to B's constructor be considered default
>>> construction? If yes, we could recreate B using the init value. But
>>> then:
>>>
>>> class C
>>> {
>>>    this(int a) {}
>>>    this(int a, int b) {}
>>> }
>>>
>>> Which constructor to call? The one with fewer parameters? What if
>>> there are overloaded constructors with identical number of parameters?
>>> Should we explicitly mark one of the constructors as default?
>>
>> I agree. classinfo.defaultConstructor should be replaced by an array of
>> all the constructors. Only when the array is empty you assume the
>> existence of the default compiler generated constructor.
>
> I'd prefer complete runtime information for all members.
>
> The problem is I do not understand what 'default constructor' and
> 'default construction' means in D for classes that have explicit
> constructors with parameters. How to automatically construct this cl
> ass:
>
> class B
> {
>   this(int a = 22) {}
> }
> ?
>
> For example, Object.factory will always return null for B, which is an
> arbitrary limitation.
>
> class C
> {
>   this(int a) {}
> }
>
> For C, the "default constructor" should probably be generated like
> this:
>
> void C_ctor(C c)
> {
>     c.__ctor(int.init);
> }
> etc.
>
> Otherwise, I cannot see how one can reconstruct an instance of C in
> 'clear'.

obj.clear(42);

Wait, uniform function call syntax doesn't work with classes! Oh, well...

clear!(C)(obj, 42);



More information about the Digitalmars-d mailing list