Это тесно связано с Are C++ enums signed or unsigned?. Согласно ответу JavaMan, enum
не является ни signed
, ни unsigned
. Но он соответствует целым правилам продвижения.Как переопределить интегральное правило для перечисления?
Я работаю с библиотекой, которая использует enums
и затем передает их на другие объекты класса, которые ожидают в основном unsigned
типов (как unsigned int
и size_t
). Включение предупреждения -Wsign-conversion
в попытке поймать законные ошибки вызывает количество ложных срабатываний из-за правил языка.
Тип правила создает ситуацию, когда ее трудно обеспечить безопасность типа и уловить распространенные ошибки. Это сложно, потому что я хочу избегать таких вещей, как static_cast
.
Есть ли способ переопределить поведение по умолчанию для продвижения enums
на бетон signed
или unsigned
? (Аналогично тому, как вы можете указать char
, подписан или без знака).
См. Также: библиотека была написана в 1990-х годах, поэтому она поддерживает множество старых компиляторов. Было бы замечательно, если бы решение касалось даже C++ 03 и, возможно, раньше.
От How to guard move constructors for C++03 and C++11?, я знаю, что на практике нет надежного способа определить, когда действуют другие варианты языка C++. Он упал на лицо во время тестирования с помощью Clang 3.5, используя -std=c++03
и -std=c++11
.
Можно ли использовать C++ 11, и вы можете изменить определение перечислений в этой библиотеке? – Praetorian
@Praetorian - К сожалению, нет, мы не можем зависеть от C++ 11. Нам еще нужно поддерживать C++ 03 (и, возможно, раньше). С другой стороны, я могу изменить определения перечислений в библиотеке. При необходимости библиотека является [Crypto ++] Вэй Дай (http://www.cryptopp.com/). Извините, что не предоставил эту информацию раньше. – jww