opMove DIP
Shachar Shemesh
shachar at weka.io
Thu Mar 29 19:27:27 UTC 2018
On 29/03/18 15:43, Basile B. wrote:
>
> Hi, simple question:
>
> I wonder why the operator you want to add is not a member function ?
> As far as i see (or as far i understand should i say) __move_post_blt
> would be a free function, right ?
>
> It it's by necessity, there's probably something missing in your DIP.
__move_post_blt is just a compiler/run time library implementation
detail. The important addition is opMove, which is a user defined
function, and is a member.
My first draft actually did place __move_post_blt as a member of the
struct. I quickly realized, however, that there is very little to gain
and lots to lose. I'll try to list some of the reasons:
* Implicitly defined by the compiler
The function would be added to the struct by the compiler, whether you
actually defined it or not. This opens a whole set of complications: do
we return it when you enumerate the struct's methods? If so, we enter a
minefield of backwards compatibility problems. If not, we're breaking
promises.
* Little to gain by allowing overriding the default
The main reason to define it as part of the struct is to allow
overriding the default behavior. The only advantage that would bring,
however, is if you want to prevent the opMove of one of your members
from running. I fail to see a use case for this.
Quite the contrary, I think opMove should prevent you from making stupid
mistakes as much as possible. The first version of the PR actually had
opMove's source reference be const, ensuring that you have a pristine
copy to investigate if you so wish. Following some feedback from Andrei,
I downgraded this to merely recommending it be const via the
documentation, but not failing the compilation if you choose to keep it
mutable.
If you provide me with cases where you think it makes sense for a
containing struct to prevent the opMove defined in one of its members
from running, we can have a more focused discussion.
Shachar
More information about the Digitalmars-d
mailing list