Chociaż powiedzmy std::add_pointer
to jednoskładnikowa, następujący kod jest akceptowana zarówno przez GCC 7.0.0 (20160608) i Clang 3.9.0:Konkatenowanie kaczki parametr szablonu dla jednoargumentowego argumentu
template <typename ...Ts>
struct tc1 {
using a = std::add_pointer<Ts...>;
};
Jednakże, podczas gdy następujący kod jest akceptowany przez Clang, jest odrzucany przez GCC:
template <typename ...Ts>
struct tc2 {
template <typename ...Us>
using b = std::add_pointer<Ts...,Us...>;
};
Czy to jest prawidłowe C++? Syntaktycznie mogę sobie wyobrazić, że przecinek jest problemem, gdy paczki są puste, ale przypuszczalnie jest to usuwane przy innych okazjach; na przykład std::common_type
akceptuje zero lub więcej argumentów, a następujące prezenty żaden problem dla obu kompilatora:
template <typename ...Ts>
struct tc3 {
template <typename ...Us>
using c = std::common_type<Ts...,Us...>;
};
Uwaga: clang odrzuca tworzenie wystąpień, takich jak 'tc2 :: b <>', ale akceptuj 'tc2 <> :: b '. –
Holt
czy to ma sens? co specjalizuje się w długości dowolnego opisu wariantowego? Nie widzę niczego, co by to określiło, więc może być specyficzna dla implementacji, ale myślę, że mogłoby to być niezdefiniowane zachowanie – kirinthos
["Program jest źle sformułowany, nie wymaga diagnostyki, jeśli: \ [... \] każda ważna specjalizacja szablonu variadic wymaga pustego pakietu parametrów szablonu "] (http://eel.is/c++draft/temp.res#8). –