Это тесно связано с вопросом Являются ли перечисления C++ подписанными или неподписанными?. Согласно ответу JavaMan, enum
не является ни signed
, ни unsigned
. Но он следует неотъемлемым правилам продвижения.
Я работаю с библиотекой, которая использует enums
, а затем передает их другим объектам класса, которые ожидают в основном типы unsigned
(например, unsigned int
и size_t
). Включение предупреждения -Wsign-conversion
в попытке выявить допустимые ошибки приводит к ряду ложных срабатываний из-за правил языка.
Правило как бы создает ситуацию, когда трудно обеспечить безопасность типов и отловить распространенные ошибки. Это сложно, потому что я хочу избежать таких вещей, как static_cast
, разбросанных по всему коду.
Есть ли способ переопределить поведение языка по умолчанию для преобразования enums
в конкретные типы signed
или unsigned
? (Подобно тому, как вы можете указать char
со знаком или без знака).
Связано это с тем, что библиотека была написана в 1990-х годах, поэтому она поддерживает несколько старых компиляторов. Было бы здорово, если бы решение обращалось даже к C++03 и, возможно, раньше.
Из Как защитить конструкторы перемещения для C++03 и C++11? я знаю, что на практике нет надежного способа обнаружить когда действуют другие варианты языка C++. Во время тестирования Clang 3.5 с использованием -std=c++03
и -std=c++11
он рухнул на землю.