DMD 0.177 release

Leopold Walkling leopold_walkling at web.de
Sat Dec 9 12:25:11 PST 2006


Sean Kelly schrieb:
> Chris Nicholson-Sauls wrote:
>> Burton Radons wrote:
>>> - Casting a value v to a struct S is now rewritten as S(v).
>>>
>>> I'm 100% against this. This is what C++ does, and it conflates 
>>> construction and casting; with some VERY simple examples (such as the 
>>> first one we think of when we think of additional types, bignums), 
>>> there's an ambiguous conflict because one of the constructors should 
>>> have a count of how many digits you want - and one of the casters 
>>> takes an integer for a value to initialise to. My solution at the 
>>> time was to add a dummy argument to the constructor so that the 
>>> compiler didn't try to match them, which is absurd.
>>>
>>> I don't know why C++ was designed like this when its error was so 
>>> blatant, but D doesn't need to replicate its mistake. "S.opCastFrom 
>>> (v)" please, except that it shouldn't be static either.
>>
>> Essentially agreed.  I'm not entirely fond of the "silent" new 
>> opAssign either, because of the visual ambiguity it can lead to.  (Its 
>> worth noting that, even though '='->opAssign is listed in the spec, 
>> the bottom of the same page still lists '=' among the operators which 
>> will not be given overloads.  Hm.)
> 
> Same.  And frankly, I'm having trouble coming up with a practical use 
> for the new opAssign.  For one thing, it isn't commutative:
> 
>     auto c = new MyClass;
>     int  i = 5;
>     c = i; // will work
>     i = c; // won't work
> 
> And now structs have an opAssign but still have binary copy semantics 
> and no ctor/dtor support.  The result is totally confusing.  What was 
> the use case for this feature?
> 
> 
> Sean

Why are opAssign overloads possible for structs? They lead to a bad 
style like the example above: It's possible to assign a primitive type 
to an aggregate type, without showing what is done in the code.



More information about the Digitalmars-d-announce mailing list