|
Boost : |
Subject: Re: [boost] Updated boost::base_from_member for C++2011
From: Daryle Walker (darylew_at_[hidden])
Date: 2012-02-18 12:56:14
> Date: Sat, 18 Feb 2012 12:04:09 +0900
> From: mimomorin_at_[hidden]
>
> Daryle Walker wrote:
> > I did it in (https://svn.boost.org/trac/boost/changeset/77046),
> > so check if it works for you now.
>
> Both r77046 and the version with SFINEAE to noexcept work well
> with clang-3.0 and gcc-4.6.
>
>
> > Of course, if you or someone else here has a better construction,
> > let me know and I'll try it instead.
> > (It still has to work for me on GCC-4.6, though.)
>
> Can NothrowConstructible be simply determined by
> BOOST_NOEXCEPT_EXPR(MemberType(static_cast<T&&>(x)...))
> rather than
> BOOST_NOEXCEPT_EXPR(::new ((void*) 0) MemberType(static_cast<T&&>(x)...))
> ?
That's the obvious way done by everyone at first, even me. I also saw it in the GCC LibStdC++v3 source for std::is_nothrow_default_constructible. However, every operation required for a noexcept expression is considered, including any destructor calls for temporary objects. That's why there's a "declval," after all. We need to call a constructor without a corresponding destructor, and the placement-new syntax (in a no-throw version) does that. The variant used is one of the few that's illegal to override.
Daryle W.
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk