我在这里发布关于检查variadic模板参数的唯一性 check variadic templates parameters for uniqueness
我的问题:为什么不编译以下代码?是不允许bug编译器或标准?
#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>]’
答案 0 :(得分:1)
我编写了这样的例子:
g++ -Wall -Wextra -std=c++11 -rdynamic -pedantic garbage.cpp
并得到了不同的错误:
garbage.cpp: In instantiation of ‘struct base_all<pack<int, char, int> >’:
garbage.cpp:17:27: required by substitution of ‘template<class P> static constexpr bool is_unique::test(is_unique<T>::check<P>*) [with P = P; T = {int, char, int}] [with P = pack<int, char, int>]’
garbage.cpp:22:63: required from ‘constexpr const bool is_unique<int, char, int>::value’
garbage.cpp:29:52: required from here
garbage.cpp:8:8: error: duplicate base type ‘id<int>’ invalid
再次突出显示错误:
重复的基本类型'id'无效
很清楚它意味着什么。 c ++禁止拥有更多相同类型的基类。因此,标准禁止这样做:
struct A
{};
struct B : A, A
{};
这就是你上面尝试做的事情。