
Date: Sat, 18 Feb 2012 12:04:09 +0900 From: mimomorin@gmail.com
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.