2011-10-16 8 views
9

C++ 11 dodaje klasy wyliczeniowe, które są wyliczeniami o silniejszym typie - wartości klas wyliczeniowych nie będą niejawnie konwertowane na wartości innych klas wyliczeniowych lub liczb całkowitych, a deklaracje forward są dozwolone z uwagi na specyfikator wymiaru jawnego.Czy mogę używać wartości klasy enum jako argumentów dla funkcji varargs?

Czy jest możliwe przekazanie wartości takich wyliczeń do funkcji varargs i zachowanie w standardowym zakresie? W ramach zachowania definiowanego przez implementację?

+0

+1, dobre pytanie Muszę przyjrzeć się najnowszej wersji roboczej, aby odpowiedzieć na to pytanie! – Flexo

Odpowiedz

8

Tak, możesz. 5.2.2/7 jawnie zezwala na argumenty dowolnego typu wyliczeniowego. Odblokowane wartości wyliczeniowe są promowane w liczbach całkowitych, ale wyliczenia z zakresu (te enum class) nie są.

Oczywiście nadal trzeba być ostrożnym przy wdrażaniu funkcji.

+1

+1 dla referencji 5.2.2/7 - Jestem całkiem pewny, że jeśli "klasa enum" byłaby z tego zwolniona, pojawiłaby się tam notatka. – Flexo

+1

Zastanawiam się, czy UB używa typu bazowego z 'va_arg', gdy sprowadzony argument był wartością wyliczeniową o zakresie? Wygląda na to, że tak. –

+0

@Johannes: Jeśli to powoduje UB, to czy nie jest to sprzeczne z celem określenia podstawowego typu w pierwszej kolejności (identyczna reprezentacja wartości)? – ildjarn

1

Myślę, że odpowiedź jest taka, że ​​może on być bezpieczny:

VA_ARGS wymaga argumentów być POD, że nie zmieniła się tak daleko, jak jestem świadomy.

Nie widzę żadnego powodu, dlaczego:

enum class foo { bar=1 }; 

nie spełniałby wymagania dotyczące POD-ności chociaż.

0

Podczas wyrzucania niektórych informacji o typie podczas korzystania z varargs (dlatego silnie odradzane dla typów nie POD) po prostu otrzymasz podstawowy typ na drugim końcu twojej varargs za pomocą funkcji. Domyślną wartością jest int ale można to zmienić (np enum class MyEnum : char { ... };)

Poprawiono: varargs rzeczywiście nie wyrzucić wszystkie informacje o typie i jeśli używasz danych POD typu powinno być dość bezpieczne.

+1

To nie jest tak, jak mówi standard. Nie wszystkie informacje o typach są odrzucane. –

+1

'int' jako wartość domyślną dotyczy tylko wyliczeń z zakresami (które są tutaj omawiane). –

+0

@AlanStokes: Dzięki. Próbowałem zmienić moje wcześniejsze odważne oświadczenie. – Florian

Powiązane problemy