2016-11-11 11 views
8

W „odliczenie Szablon argumentem dla szablonów klas” propozycja (P0091R2) zawiera następujący przykład:Czy "odliczanie argumentów szablonu dla szablonów klas" ma wyprowadzać puste pakiety parametrów dla szablonów klas variadic?

template<class ... Ts> struct X { X(Ts...) }; 
X x1{1}; // OK X<int> 
X x11; // OK X<> 

(Pomijając fakt, że definicja konstruktora brakuje ciało), przykład zdaje się sugerować, że szablon klasyz klasy zerowej zbudowany z zerowym argumentem zostanie wydedukowany z pustym pakietem parametrów.

Niestety, najnowsza wersja g ++ nie zgadza:

int main() 
{ 
    X x1{1}; 
    X x11; 
} 

In function 'int main()': 
error: invalid use of template-name 'X' without an argument list 
X x11; 
^ 
note: class template argument deduction requires an initializer 

example on wandbox


nie mogłem znaleźć wyraźnego sformułowania we wniosku, że wyjaśnia ta interakcja. Czy g ++ jest tu nieprawidłowy?

+0

'X x11 {};' działa. – ildjarn

+1

Powiedziałbym, że wdrożenie gcc jest teraz na etapie eksperymentalnym. to jest 'vector v {2,3}' działa, ale 'vector v {2,3,4}' daje błąd, że ''int' nie jest typem klasy, struktury ani typu unii. – krzaq

+0

@krzaq: wydaje się, że próbuje wywołać [constructor (2)] (http://en.cppreference.com/w/cpp/container/vector/vector) dla tego konkretnego przypadku. Zastanawiam się, czy to faktycznie jest zamierzone * (tj. Jakie są zasady ujednoznaczniania w tych przypadkach) *. Przy okazji, mam świadomość, że gcc jest na etapie eksperymentu - moim zainteresowaniem jest składanie raportów o błędach tam, gdzie to właściwe. –

Odpowiedz

8

[dcl.type.class.deduct]/1:

Jeżeli zastępczy przewidywaną typu klasy pojawia się jako dekl-specyfikatorem w decl-specifier-nast z proste deklaracji The init- deklarator tej deklaracji ma postać:

deklarator-idatrybut specifier-nast optinitializer

inicjatora nie jest obowiązkowe.

+0

Nice. To bardzo przydatna strona! –

+0

Więc 'X x11 {};' powinno działać? – Yakk

+4

@Yakk Tak, chociaż wygląda na to, że [modyfikują to coś] (https://twitter.com/AlisdairMered/status/797227816999743490), więc może będę musiał to wkrótce edytować ... –

Powiązane problemy