Implementing SmartPtr - compiler bug?

via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue Oct 28 03:05:57 PDT 2014


On Tuesday, 28 October 2014 at 08:36:07 UTC, Szymon Gatner wrote:
> On Monday, 27 October 2014 at 18:42:11 UTC, Marc Schütz wrote:
>> On Monday, 27 October 2014 at 16:58:56 UTC, Szymon Gatner 
>> wrote:
>>> On Monday, 27 October 2014 at 14:04:53 UTC, Marc Schütz wrote:
>>>> On Monday, 27 October 2014 at 12:40:17 UTC, Shachar Shemesh 
>>>> wrote:
>>>>> On 27/10/14 11:31, Szymon Gatner wrote:
>>>>>
>>>>>> Right, sorry. Tho I admit I made assumptions since that 
>>>>>> was not the full
>>>>>> code.
>>>>>
>>>>> I've opened a bug. It has a fully contained sample (that 
>>>>> does not, in fact, implement smartptr).
>>>>>
>>>>> https://issues.dlang.org/show_bug.cgi?id=13661
>>>>
>>>> Strictly speaking, your opAssign is wrong, because it 
>>>> doesn't swap source and destination, as it should. This 
>>>> doesn't matter here, but it would for a smartptr.
>>>>
>>>> However, that opAssign isn't even called is certainly a bug.
>>>
>>> Why would opAssign() swap things?
>>
>> This is necessary to make assignment exception safe (in the 
>> general case). It's known as the copy-and-swap idiom in C++. 
>> Here it's described in the D spec:
>>
>> http://dlang.org/struct#assign-overload
>>
>> For your example code it's not necessary, because there can 
>> never be exceptions, but depending on what the smart pointer 
>> does, it might throw in one of its members' opAssign, which 
>> could lead to a partially copied object.
>
> Copy-and-swap in C++ as the name implies requires 1) copy first 
> - a temporary copy-constructed object on created on the stack 
> then 2) trivial/nothrow swap with that temporary. Your 
> suggestion sounded like source and destination of opAssign() 
> were suppose to be swapped.

Sorry, this was not intended.

> In C++ this is sometimes used when move-assigning.

D does it automatically (and it always can, because structs need 
to be movable, e.g. contain no pointers to themselves), unless 
you define your own opAssign(), in which case your supposed to 
implement it in a way that has the same semantics.


More information about the Digitalmars-d-learn mailing list