Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板参数中默认模板参数的奇怪行为_C++_C++11_Variadic Templates_Template Templates - Fatal编程技术网

C++ 模板参数中默认模板参数的奇怪行为

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; };

考虑以下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;
}
#包括
模板结构控制{

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。假设它是特定于编译器实现的。我可以看到发生了什么,我在问在标准中这个行为是在哪里定义的。