|
Boost : |
From: Thorsten Ottosen (thorsten.ottosen_at_[hidden])
Date: 2008-04-11 02:22:58
Andrey Semashev skrev:
> Thorsten Ottosen wrote:
>> Andrey Semashev skrev:
>>> Thorsten Ottosen wrote:
>>>> Comments?
>>> Your approach requires the T to be default constructible which is not
>>> always the case.
>> Why is this better than the far more expensive copy-construction?
>
> 1. It adds a new requirement to T.
But only for swap().
> I'd rather not have it since, as
> other noted, optional is frequently used with non-default-constructible
> types. You'll simply restrict swap to be available only for
> default-constructible types, which is not the case ATM.
True.
> 2. I'd rather not assume what is more or less expensive. The opposite
> case is quite common too (shared pimpl object is an example).
In that case they are about the same complexity. But for any container
or aggregation of containers, there is a huge difference. Just consider
std::vector<std::map<int,int>>, for example.
>>> Besides, to my mind, the current implementation is more
>>> obvious for the user.
>> No user expects swap to throw or invalidate iterators or references like
>> the current implementation does.
>
> Default constructor may throw as well, you won't gain anything here.
Default constructors are much less likely to throw.
> And
> I'm not sure I understand what you meant with iterators or references
> invalidation.
If I hold a reference or an iterator into, say a vector<T> object,
that reference or iterator is not invalidated by swapping that object
with another. For optional<vector<T>> this is no longer true.
Anyway, I'll like to hear Fernando's take on it.
-Thorsten
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk