C++ 模板参数中默认模板参数的奇怪行为
考虑以下C++11程序:C++ 模板参数中默认模板参数的奇怪行为,c++,c++11,variadic-templates,template-templates,C++,C++11,Variadic Templates,Template Templates,考虑以下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; };
#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;
}
#包括
模板结构控制{
Cont(){std::cout在Wrap2类中,参数包“class…E”将替换“class C”指定的所有参数(包括默认的“int”参数),因此“Wrap2 w2”将返回1,它是struct Cont的默认参数
参数包替换了C类的所有参数,因此C的默认参数在这里不起作用
#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
#包括
#包括
模板结构MyTest
{
MyTest()
{
std::cout ICC和MSVC产生44
。我将讨论bug。假设它是特定于编译器实现的。我可以看到发生了什么,我在问在标准中这个行为是在哪里定义的。