2016-04-18 10 views
2

なぜC++ 03でコンパイルすると、as_vet_typeboost::fusion::vector2<const int, const int>になり、C++ 11でコンパイルするとboost::fusion::vector<int, int>になるのですか? constがC++ 11で見つからないこれはバグですか、機能ですか? 私はこれをboost 1.60でテストしました。ブースト・フュージョンなぜ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それが見えなくなる:( とにかく私はhappenningれているものを考え出しそのコメントに感謝。

それは、この問題は、ブースト関連していることが判明:: boost :: result_ofはboost :: fusionとは異なります。 boost :: result_ofは、decltypeが使用されているときにC++ 11で異なって動作する可能性があります。 QV資格 "

私はこの簡単なexpレナンシング。 C++ 11では、この関数の宣言では、const int f(); constはコンパイラによって単純に無視され、fのシグネチャはint f();となり、decltype(const int f());intとなります。警告:関数の戻り値の型 [-Wignored-修飾子]のconst int型では無視型修飾子あなたはconst int f();

prog.cc:5:13を宣言した場合

GCC 5.3.2も、次の警告が生成されますf()