我在这里发布关于检查可变参数模板参数的唯一性 检查可变参数模板参数的唯一性。
我的问题:为什么不编译以下代码?它是错误编译器还是标准是不允许的?
#include <iostream>
template< class ... > struct pack{};
template< class > struct id{};
template< class > struct base_all;
template< class ...T>
struct base_all< pack<T...> > : id<T> ... {using type = int;}; // <-- error with `int`, `char`, `int` parameters.
template< class ...T>
struct is_unique
{
template< class P, std::size_t = sizeof(base_all<P>) >
struct check;
template< class P >
static constexpr bool test( check< P > * ) noexcept { return true ;}
template< class P >
static constexpr bool test( ... ) noexcept{ return false; }
static constexpr bool value = test< pack<T...> >( nullptr );
};
int main()
{
constexpr bool b = is_unique<int, float, double>::value;
constexpr bool c = is_unique<int, char, int >::value; //<--- error
std::cout << std::boolalpha << "b = " << b << "\nc = " << c << std::endl;
}
错误编译器 gcc 4.8.1:
is_unique_args.cpp:16:42: required by substitution of ‘template<class P> static constexpr bool is_unique<T>::test(is_unique<T>::check<P>*) [with P = P; T = {int, char, int}] [with P = pack<int, char, int>]’