Могу ли я использовать значения класса enum в качестве аргументов для функций varargs? - PullRequest
9 голосов
/ 16 октября 2011

C ++ 11 добавляет перечислимые классы, которые являются перечислениями более строгого типа - значения перечислимых классов не будут неявно преобразованы в значения других перечислимых классов или целых чисел, а прямое объявление разрешено в силу явного спецификатора размера.

Можно ли передавать значения таких перечислений функциям varargs и оставаться в рамках поведения, определенного стандартами? В поведении, определяемом реализацией?

Ответы [ 3 ]

8 голосов
/ 16 октября 2011

Да, вы можете. 5.2.2 / 7 явно разрешает аргументы любого типа перечисления. Значения перечисления с незаданной областью продвигаются целыми числами, а перечисления с областью видимости (enum class) - нет.

Конечно, вы все равно должны быть осторожны при реализации функции.

1 голос
/ 16 октября 2011

Я думаю, что ответ в том, что это может быть безопасно:

VA_ARGS требует, чтобы аргументы были POD, что, насколько я знаю, не изменилось.

Я не вижу причин, по которым:

enum class foo { bar=1 };

Не соответствует требованиям POD-ness.

0 голосов
/ 16 октября 2011

Когда вы выбрасываете некоторую информацию о типах при использовании varargs (поэтому это настоятельно не рекомендуется для не POD-типов), вы просто получите базовый тип на другом конце ваших varargs, используя функцию.По умолчанию int, но вы можете изменить это (например, enum class MyEnum : char { ... };)

Исправлено: varargs действительно не отбрасывает всю информацию о типе, и если вы используете тип данных POD, вы должны бытьдовольно безопасно.

...