почему набор boost mpl допускает неуникальные типы

Я считаю, что мое понимание boost::mpl::setдолжно быть в корне ошибочным. Я думал, что разрешены только уникальные типы.

Но компилируется следующий код:

#include <boost/mpl/set.hpp>
#include <boost/mpl/vector.hpp>
#include <boost/mpl/accumulate.hpp>
#include <boost/mpl/plus.hpp>
#include <boost/mpl/int.hpp>
#include <boost/mpl/placeholders.hpp>
#include <boost/mpl/sizeof.hpp>
#include <boost/mpl/assert.hpp>
using namespace boost::mpl;

typedef set<long,float,long> my_set; //long repeated in set?
typedef vector<long,float,long> my_vec; //seems reasonable

typedef accumulate<
  my_set
  , int_<0>
  , plus<_1, sizeof_<_2>>
  >::type set_size;

typedef accumulate<
  my_vec
  , int_<0>
  , plus<_1, sizeof_<_2>>
  >::type vec_size;

BOOST_MPL_ASSERT_RELATION( vec_size::value, ==, sizeof(long)+sizeof(float)+sizeof(long) );
//why does the following line compile?
//shouldn't the size be sizeof(long)+sizeof(float) instead?
BOOST_MPL_ASSERT_RELATION( set_size::value, ==, sizeof(long)+sizeof(float)+sizeof(long) );
5
задан Luc Touraille 6 April 2012 в 15:10
поделиться