extern(C++) and struct (constness mangling problem ?)
deadalnix
deadalnix at gmail.com
Tue Nov 29 13:46:27 PST 2011
Le 29/11/2011 22:09, Andrei Alexandrescu a écrit :
> On 11/29/11 11:39 AM, deadalnix wrote:
>> Le 29/11/2011 19:52, Andrei Alexandrescu a écrit :
>>> On 11/29/11 10:50 AM, deadalnix wrote:
>>>> 2/ Use that stract/class as a value type. You can do POD, but also
>>>> define constructor and destructor, copy constructor and overload
>>>> assignement. Anyway, you'll never be able to use proper polymorphism
>>>> here, because it would require virtual destructor at least. This is
>>>> IMO,
>>>> what D's struct should achieve.
>>>
>>> Yes.
>>>
>>>> The 2/ case is overly used in almost any C++ program. And D struct
>>>> should be able to match them. It wouldn't require much to make it
>>>> working :
>>>> - Default constructor.
>>>
>>> No.
>>>
>>
>> No, as "No it will never be done for reason xxx" or as in "No you are
>> wrong and it not necessary, here the way to do : xxx".
>>
>> In both cases, the xxx is the most interesting part :'(
>
> Neither :o). The default initializer that doesn't do any real "work",
> does not throw, and puts the object in a state without ex-situ ownership
> has brought D too many benefits to ignore.
>
> We should be able to define types that refuse default initialization (a
> la non-null pointers), but if the default initializer exists, it's good
> as it is.
>
>
> Andrei
>
I do not question the benefit of initializer that don't do any real
"work" as you said. This is definitively a good thing.
What I question, is the impossibility for the programmer to do another
way. This result in very convoluted way to interract with C++. The D
phylosophy is to enforce a clean and safe way to do thing (and default
initializer definitively goes in that direction) but also open the
possibility to get dirty and do whatever is required to do yout hanky
panky stuffs.
Here is what I suggest :
- struct with no default constructor just behave the same way as the
did until now.
- struct can disable the default constructor as it is possible now. If
you create a variable of that type without initialization, you get an error.
- struct can define a default constructor. You get the same errors as
you get when you disable that default constructor.
With some code :
struct S {
// default constructor defined or disabled
}
S s; // Error if the default constructor is defined or disabled;
S s = S(); // OK if you have a default constructor, error otherwize.
S s = S.init; // Call the postblit if a default constructor exists or is
disabled
That way, we keep the benefit of default initializer for most struct,
but open the door for programmers that don't know what fear is about.
This modify the behaviour of the struct, but, ATM, the default
constructor can be disabled, and it result in inconsistent behaviour
(exemple 1 generate error, exemple 3 compile fine and don't call postblit).
As the behaviour is different - we losse benefits of default
initializers -, we may want to explicit that with a keyword. As you
suggested, this is similar with non nullable references and could use
the same keyword (and this is a feature that is missing definitively,
null check is so easy to forget that it would be great that the compiler
help us in the task).
This definitively have an impact on severals aspect of D (resising
arrays is a good exemple). Thoses would be impacted by the default
constructor caracteritics (eventually can throw, become exepensive in
computation, etc . . .). We may want to disable thoses operations on
such types or limit them in some ways.
By the way, bug on opAssign is filled now.
More information about the Digitalmars-d
mailing list