Rozważmy C++ 11 program:Dziwne zachowanie domyślnego szablonu-argumentu w szablonie-template-parametru
#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;
}
Kiedy skompilowany albo z gcc lub brzękiem, wyjście jest 41
.
Czy to zachowanie jest zgodne z normą? Gdzie dokładnie określa to standard (zarówno dla Wrap1
i Wrap2
)? To jest częściowo zainspirowane przez this other question.
ICC i MSVC generuje '44'. Pójdę z bugiem. –
Załóżmy, że jest to specyficzna implementacja kompilatora. –