2016-04-18 3 views
2

Почему следующий код as_vet_type является boost::fusion::vector2<const int, const int> при компиляции с C++ 03 и при компиляции с помощью C++ 11? const отсутствует с C++ 11. Это ошибка или функция? Я тестировал это с усилением 1.60.boost fusion Почему существует другой результат в C++ 11 и C++ 03?

#include <boost/fusion/container/vector.hpp> 
#include <boost/fusion/include/vector.hpp> 
#include <boost/fusion/container/vector/vector_fwd.hpp> 
#include <boost/fusion/include/vector_fwd.hpp> 

#include <boost/fusion/algorithm/transformation/transform.hpp> 
#include <boost/fusion/include/transform.hpp> 

#include <boost/fusion/container/vector/convert.hpp> 
#include <boost/fusion/include/as_vector.hpp> 

struct functor 
{ 
    template<class> struct result; 

    template<class F, class T> 
    struct result<F(T)> { 
     typedef const int type; 
    }; 

    template<class T> 
    typename result<functor(T) >::type 
    operator()(T x) const; 

}; 




int main() 
{ 
    typedef boost::fusion::vector<const int & ,char &> cont_type; 
    typedef typename boost::fusion::result_of::transform<cont_type ,functor >::type view_type; 
    typedef typename boost::fusion::result_of::as_vector<view_type>::type as_vec_type; 

    as_vec_type asd; 
    asd.x; 
    return 0; 
} 

ответ

1

я получил комментарий от кого-то, но Unfortunetly это уже не видно :( Во всяком случае, благодаря этому замечанию я разобрался, что Происходило.

Оказывается, что эта проблема связана подталкивание :: result_of и не повышать :: fusion. boost :: result_of может вести себя раздельно в C++ 11 при использовании decltype и в C++ 03. boost :: result_of документация описывает это различие в части «Неклассовые значения и cv-qualification ".

Я могу предоставить этот упрощенный exp lanation. В C++ 11 в объявлении этой функции: const int f(); const просто игнорируется компилятором, а f-подпись становится int f();, и именно поэтому decltype(const int f()); - int.

GCC 5.3.2 будет даже производить следующее предупреждение, если вы объявите const int f();

prog.cc:5:13: отборочные типа игнорировал от типа возвращаемой функции [-Wignored-отборочных] сопзИте Int: предупреждение f()