C ++ 11 добавляет перечислимые классы, которые являются перечислениями более строгого типа - значения перечислимых классов не будут неявно преобразованы в значения других перечислимых классов или целых чисел, а прямое объявление разрешено в силу явного спецификатора размера.
Можно ли передавать значения таких перечислений функциям varargs и оставаться в рамках поведения, определенного стандартами? В поведении, определяемом реализацией?
Да, вы можете. 5.2.2 / 7 явно разрешает аргументы любого типа перечисления. Значения перечисления с незаданной областью продвигаются целыми числами, а перечисления с областью видимости (enum class) - нет.
enum class
Конечно, вы все равно должны быть осторожны при реализации функции.
Я думаю, что ответ в том, что это может быть безопасно:
VA_ARGS требует, чтобы аргументы были POD, что, насколько я знаю, не изменилось.
VA_ARGS
Я не вижу причин, по которым:
enum class foo { bar=1 };
Не соответствует требованиям POD-ness.
Когда вы выбрасываете некоторую информацию о типах при использовании varargs (поэтому это настоятельно не рекомендуется для не POD-типов), вы просто получите базовый тип на другом конце ваших varargs, используя функцию.По умолчанию int, но вы можете изменить это (например, enum class MyEnum : char { ... };)
int
enum class MyEnum : char { ... };
Исправлено: varargs действительно не отбрасывает всю информацию о типе, и если вы используете тип данных POD, вы должны бытьдовольно безопасно.