2016-04-18 3 views
2

Warum ist der folgende Typ as_vet_typeboost::fusion::vector2<const int, const int> beim Kompilieren mit C++ 03 und boost::fusion::vector<int, int> beim Kompilieren mit C++ 11? const fehlt mit C++ 11. Ist das ein Fehler oder eine Funktion? Ich habe das mit Boost 1,60 getestet.Boost-Fusion Warum gibt es unterschiedliche Ergebnisse in C++ 11 und 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; 
} 

Antwort

1

bekam ich einen Kommentar von jemandem, aber unfortunetly ist es nicht mehr sichtbar :( Wie dem auch sei dank dieser Kommentar i herausgefunden, was happenning.

Es stellt sich heraus, dass dieses Thema Schub zusammenhängt :: result_of und nicht boost :: fusion boost :: result_of kann sich in C++ 11 anders verhalten, wenn declltype verwendet wird und in C++ 03. boost :: result_of documentation beschreibt diesen Unterschied im Teil "Nicht-Klasse prvalues ​​and cv-qualification ".

Ich kann diese vereinfachte exp bereitstellen Lanation. In C++ 11, in dieser Funktion Erklärung: const int f(); const wird einfach vom Compiler ignoriert und f-Signatur wird int f(); und das ist warum decltype(const int f()); ist int.

GCC 5.3.2 wird auch die folgende Warnung erzeugen, wenn Sie const int f();

prog.cc:5:13 erklären: Warnung: Typ-Qualifikation auf Funktion Rückgabetyp [-Wignored-Qualifier] const int ignoriert f()

Verwandte Themen