|
Boost : |
Subject: Re: [boost] boost::mpl::for_each and value_initialized
From: Niels Dekker - address until 2010-10-10 (niels_address_until_2010-10-10_at_[hidden])
Date: 2010-01-21 13:20:59
>> Do I understand correctly that you want the memset call to be
>> skipped for those compiler versions that have implemented
>> value-initialization entirely correctly?
Peter Foelsche wrote:
> I'm only concerned with boost::mpl::for_each
> This function calls a function object by passing an object of the
> matching type.
> The contents of this object usually do not matter -- and in case they
> do, the programmer can write a default constructor to initialize this
> object. So there is no need in boost::mpl::for_each to call
> value_initialized.
So you think the issue can be resolved properly, merely by modifying
mpl/for_each.hpp, right? You proposed at
http://lists.boost.org/Archives/boost/2009/09/155805.php to modify
mpl/for_each.hpp by changing:
! value_initialized<arg> x;
! aux::unwrap(f, 0)(boost::get(x));
Into:
! aux::unwrap(f, 0)(arg());
I see some subtle differences here. First of all, boost::get(x) return a
reference to an lvalue, while arg() is an rvalue. Do you think that's okay?
Secondly, things *might* go wrong if arg doesn't have a user-declared
default-constructor *and* the compiler hasn't correctly implemented
value-initialization. That's why Fernando and I added the memset call to
boost::value_initialized, of course. But you think the data members of the
temporary arg() won't be accessed anyway, right? Unless arg has a
user-declared default-constructor?
I'm sorry I don't know mpl/for_each.hpp well enough. But if the answer to
each of the above questions is yes, I guess your proposal is fine.
Kind regards, Niels
-- Niels Dekker http://www.xs4all.nl/~nd/dekkerware Scientific programmer at LKEB, Leiden University Medical Center
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk