
David Abrahams wrote:
David Abrahams wrote:
Still no dice for vc7.1, though.
Hum, that was too easy:
For every difficult problem, there is a solution that is simple, elegant ... and wrong. Correct version below fails. :( You can't use int for this test because the "const" is ignored in "int const const_rvalue()". You need to use UDTs. #include <boost/static_assert.hpp> typedef char yes; typedef char (&no)[2]; template <class T> yes is_nonconst_rvalue(T const&, ...); template <class T> no is_nonconst_rvalue(T&, int); struct foo { #ifndef BOOST_MSVC template<typename U> operator U() const; template<typename V> operator V& () volatile const; #else template<typename U> operator U() volatile; template<typename V> operator V& () const; #endif static foo const instance; static bool select; }; #define IS_RVALUE(x) \ (sizeof(is_nonconst_rvalue((foo::select ? foo::instance : (x)), 0)) == sizeof(yes)) struct bar {}; bar rvalue(); bar const const_rvalue(); bar& lvalue(); bar const& const_lvalue(); bar volatile volatile_rvalue(); bar const volatile const_volatile_rvalue(); bar volatile& volatile_lvalue(); bar const volatile& const_volatile_lvalue(); BOOST_STATIC_ASSERT(IS_RVALUE(rvalue())); BOOST_STATIC_ASSERT(IS_RVALUE(const_rvalue())); BOOST_STATIC_ASSERT(!IS_RVALUE(lvalue())); BOOST_STATIC_ASSERT(!IS_RVALUE(const_lvalue())); BOOST_STATIC_ASSERT(IS_RVALUE(volatile_rvalue())); BOOST_STATIC_ASSERT(IS_RVALUE(const_volatile_rvalue())); BOOST_STATIC_ASSERT(!IS_RVALUE(volatile_lvalue())); BOOST_STATIC_ASSERT(!IS_RVALUE(const_volatile_lvalue())); -- Eric Niebler Boost Consulting www.boost-consulting.com