$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
Subject: Re: [boost] [pimpl] Some comments
From: Mostafa (mostafa_working_away_at_[hidden])
Date: 2014-06-06 06:12:10
On Thu, 05 Jun 2014 14:21:04 -0700, Andrzej Krzemienski
<akrzemi1_at_[hidden]> wrote:
> It looks from the docs that 'pointer_semantics' implements something
> like a
> flyweight. This is so against value semantics.
Not to sound snarky, but pointer semantics is exactly that, pointer
semantics, I don't expect it to behave like value semantics.
> One of the expectations of
> types returned by value is that changing the original does no affect the
> copy:
> T a = c;
> T b = c;
> zap(a);
> assert(b==c && a!=b);
> Although the author of class Book knows that it is implemented with
> pointer_semantics, the users of the class are likely not to know it, and
> since Book doesn't look like a pointer, they will be expecting value
> semantics, and will be severely punished.
Unless I'm dealing with pimpl'd classes, then I don't hold that
expectation. Granted, it may not be clear from the type name that the type
in question is pimpl'd, but I chalk that up to poor naming and language
flexibility. The same issue can easily arise with the following bare bone
C++ code:
// In some header file.
typedef some_type * widget;
// In some other header file.
widget foo();
When dealing with pimpl'd classes, the expected norm (in my experience)
for making deep copies is to use the clone function.