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
nie mogłem znaleźć wyraźnego sformułowania we wniosku, że wyjaśnia ta interakcja. Czy g ++ jest tu nieprawidłowy?
'X x11 {};' działa. – ildjarn
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
@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. –