c++ c++11 variadic-templates template-templates

c++ - Comportamiento extraño de la plantilla-argumento por defecto en una plantilla-parámetro-plantilla



c++11 variadic-templates (1)

Considere este programa C ++ 11:

#include <iostream> template <class A, class B = char> struct Cont { Cont () { std::cout << sizeof(B); } }; template <template<class, class = int> class C, class E> class Wrap1 { C<E> ce; }; template <template<class, class = int> class C, class... E> class Wrap2 { C<E...> ce; }; int main () { Wrap1<Cont, void> w1; Wrap2<Cont, void> w2; }

Cuando se compila con gcc o clang, la salida es 41 .

¿Es este comportamiento según la norma? ¿Dónde exactamente lo especifica el estándar (tanto para Wrap1 como para Wrap2 )?

Esta pregunta está inspirada en parte por esta otra pregunta .


En la clase Wrap2, el paquete de parámetros "clase ... E" reemplazará todos los parámetros especificados por "clase C" (incluya el parámetro predeterminado "int"), por lo que "Wrap2 w2" devolverá 1, que es el parámetro predeterminado de la estructura Cont .

El paquete de parámetros reemplazó todos los parámetros de la clase C, por lo que los parámetros predeterminados de C no funcionaron aquí.

#include <iostream> #include <typeinfo> template <class A=char, class B = short, class C = int> struct MyTest { MyTest () { std::cout << sizeof(A) << " " << typeid(A).name() << " "; std::cout << sizeof(B) << " " << typeid(B).name() << " "; std::cout << sizeof(C) << " " << typeid(C).name() << std::endl; } }; template <template<class = double, class = double, class = double> class D, class E, class... F> class Wrap { D<E> de; // the parameters of D is: E + default parameters of D. D<F...> df; // the parameters of D is: F... + default parameters of MyTest, the default parameter of D don''t work, it will be replaced by pack F. }; int main () { Wrap<MyTest, int, int> w; } //g++ 5.4.0 //output: //4 i 8 d 8 d //4 i 2 s 4 i