jako pytanie, które pojawiły się podczas dyskusji this SO question:Czy można zadeklarować obiekt constexpr initializer_list?
Czy to jest legalne, może z N3471, aby zadeklarować constexpr std::initializer_list
obiekt? Przykład:
constexpr std::initializer_list<int> my_list{};
Dlaczego myślę, że to nie może być legalne: initializer_list
musiałby być typu dosłowny; ale czy są jakieś gwarancje, że jest to typ literalny?
Cytaty z N3485.
[dcl.constexpr]/9:
specyfikator constexpr stosowane w zgłoszenia obiektu deklaruje obiekt jako const. Taki obiekt będzie miał literał i będzie inicjowany.
dosłownych wymagania rodzaje [basic.types]/10, pod-typy klas pocisku:
- typu klasy (Rozdział 9), który ma wszystkie z następujących właściwości:
- ma trywialny destruktor,
- każde wywołanie konstruktora i pełne wyrażenie w inicjatorach klamrowych lub równoważnych dla niestatycznych elementów danych (jeśli występują) jest wyrażeniem stałym (5.19),
- jest to typ agregacyjny (8.5.1) lub ma co najmniej jeden konstruktor constexpr lub szablon konstruktora, który nie jest konstruktorem kopiowania ani przenoszenia, a wszystkie jego niestatyczne elementy danych i klasy bazowe mają wartość inną niż non-static. -wolne typy literalne.
Dodatkowe punkty za odpowiedzi;) jeśli
constexpr std::initializer_list<int> my_list = {1,2,3,4,5};
jest legalne (referencje). Choć myślę, że to jest objęte powyższym + [dcl.init.list]/5
Powtarzam tylko to, co powiedziałem na czacie: nie mam sensu tworzyć funkcji 'std :: initializer_list'' constexpr' (N3741), jeśli nie możemy legalnie napisać ostatniego przykładu. – Morwenn