Implementing SmartPtr - compiler bug?

via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Mon Oct 27 11:42:09 PDT 2014


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.


More information about the Digitalmars-d-learn mailing list