Вот что происходит
BOOST_NO_INCLASS_MEMBER_INITIALIZATION
определяется в Boost.Config (не уверен, почему это так для gcc, но я пока оставлю это в покое).Таким образом,
BOOST_STATIC_CONSTANT(no_cv_t, minus_one = (static_cast<no_cv_t>(-1)));
BOOST_STATIC_CONSTANT(no_cv_t, zero = (static_cast<no_cv_t>(0)));
объявлений в boost::detail::is_unsigned_values
расширяются до
enum { minus_one = (static_cast<no_cv_t>(-1)) };
enum { zero = (static_cast<no_cv_t>(0)) };
, после чего эти два перечислителя неназванных, но различных перечислений сравниваются в boost::detail::is_ununsigned_helper
.Следовательно, предупреждение, которое не произошло бы, если бы BOOST_STATIC_CONSTANT()
было расширено до static const no_cv_t blah blah...
.
Осталось ответить на два вопроса:
-> Почему BOOST_NO_INCLASS_MEMBER_INITIALIZATION
получаетопределен в вашем случае?
-> Если этот макрос определен, может быть выдано такое предупреждение (сравнение перечислителей с различными перечислениями).Здесь безвредно, но было бы неплохо предотвратить это в Boost.Стоит ли это того?
Примечание. Я использовал код Boost 1.43 для справки.