问题
I'm trying to do something along the lines of this using GCC 4.7 snapshot:
template <int n, int... xs>
struct foo {
static const int value = 0;
};
// partial specialization where n is number of ints in xs:
template <int... xs>
struct foo<sizeof...(xs), xs...> { // error: template argument ‘sizeof (xs ...)’
// involves template parameter(s)
static const int value = 1;
};
template <int... xs>
struct foo<sizeof(xs), xs...> { // This compiles fine. sizeof(xs) is sizeof int
// even though packs aren't expanded
static const int value = 2;
};
The error is strange because sizeof instead of sizeof... works in this case. Both seem like they could be easily computed during compile time.
Is the compiler correct that I can't use sizeof...
in template arguments for specialization?
回答1:
I'm going to assume this is a compiler issue after reading this post.
A partially specialized non-type argument expression shall not involve a template parameter of the partial specialization except when the argument expression is a simple identifier.
Which is being disputed here.
GCC is either incorrectly unpacking the parameter pack, or evaluating sizeof
prematurely.
Response to bug report I filed may be helpful.
来源:https://stackoverflow.com/questions/8147010/is-sizeof-allowed-in-template-arguments-for-specialization