Opened 11 years ago
Closed 4 years ago
#5795 closed Bugs (duplicate)
is_rvalue_reference returns wrong result when rvalue reference to a function is passed
Reported by: | Owned by: | John Maddock | |
---|---|---|---|
Milestone: | To Be Determined | Component: | type_traits |
Version: | Boost 1.47.0 | Severity: | Problem |
Keywords: | Cc: |
Description
On Visual C++ 10.0.
Compile error occured:
#include <boost/type_traits/is_rvalue_reference.hpp> static_assert(boost::is_rvalue_reference<void (&&)()>::value == true, ""); int main(){}
info: Compile error occured use std::is_rvalue_reference
Change History (4)
comment:1 by , 11 years ago
comment:2 by , 11 years ago
Partial specilizations help solve the problem.
For example, the following additional header works well.
is_rvalue_reference_patch.hpp (please place this file in the include paths)
#ifndef BOOST_PP_IS_ITERATING #ifndef IS_RVALUE_REFERENCE_PATCH_HPP #define IS_RVALUE_REFERENCE_PATCH_HPP #include <boost/mpl/bool.hpp> #include <boost/preprocessor/iteration/iterate.hpp> #include <boost/preprocessor/punctuation/comma_if.hpp> #include <boost/preprocessor/repetition/enum_params.hpp> #include <boost/preprocessor/repetition/enum_trailing_params.hpp> #include <boost/type_traits/is_rvalue_reference.hpp> namespace boost { #define BOOST_PP_ITERATION_PARAMS_1 (3, (0, 25, "is_rvalue_reference_patch.hpp")) #include BOOST_PP_ITERATE() } // namespace boost #endif // IS_RVALUE_REFERENCE_PATCH_HPP #else #define n BOOST_PP_ITERATION() template <class R BOOST_PP_ENUM_TRAILING_PARAMS(n, class A)> struct is_rvalue_reference<R (&&)(BOOST_PP_ENUM_PARAMS(n, A))> : boost::mpl::true_ {}; template <class R BOOST_PP_ENUM_TRAILING_PARAMS(n, class A)> struct is_rvalue_reference<R (&&)(BOOST_PP_ENUM_PARAMS(n, A) BOOST_PP_COMMA_IF(n) ...)> : boost::mpl::true_ {}; #undef n #endif
test.cpp
#include <boost/static_assert.hpp> #include <boost/type_traits/is_rvalue_reference.hpp> #include "./is_rvalue_reference_patch.hpp" BOOST_STATIC_ASSERT((boost::is_rvalue_reference<int (&&)(int)>::value)); BOOST_STATIC_ASSERT((boost::is_rvalue_reference<int (&&)(int, ...)>::value));
comment:4 by , 4 years ago
Resolution: | → duplicate |
---|---|
Status: | new → closed |
Note:
See TracTickets
for help on using tickets.
I don't see an easy fix for this - it looks like a compiler bug - and std::is_rvalue_reference is implemented in exactly the same way as our trait, and has the same issue :-(
BTW we do have a test case for this (tricky_rvalue_test.cpp), and the issue has been reported to the VC++ team.