Boost logo

Boost :

From: Daryle Walker (darylew_at_[hidden])
Date: 2004-07-02 05:13:34


On 7/1/04 8:48 AM, "David Abrahams" <dave_at_[hidden]> wrote:

> Daniel Frey <daniel.frey_at_[hidden]> writes:
[SNIP]
>> I thus wrote the following small helper:
>>
>> template< typename T > void reset( T& t )
>> {
>> T().swap( t );
>> }
>>
>> Would this make a good addition to boost.utility? Any comments welcome...
>
> Not unless you make it generic:
>
> template< typename T > void reset( T& t )
> {
> using std::swap;
> T x;
> swap(x, t);
> }

Wouldn't that lead to undefined behavior as-is? There's a dirty little
secret in C++ that unmentioned construction is _not_ the same as default
construction for most types! For most "T", including POD types, you'll give
"x" a random bunch of bits, which cannot be a source of an assignment (only
an assignment destination).

Unmentioned construction implies default construction only if "T" is:
    1. A class type with a default constructor explicitly written
    2. A class type that gets an automatic default constructor because it
has a base or member on this list
    3. An array of a type on this list

I think that any other type (built-ins, enums, POD structs) needs the
explicit default constructor sequence:

template < typename T >
void reset( T & t )
{
    using std::swap;
    T x = T();
    swap( x, t );
}

[I'm not sure that any books or, worse, the standard, explicitly mention
this.]

-- 
Daryle Walker
Mac, Internet, and Video Game Junkie
darylew AT hotmail DOT com

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk