Is sizeof… allowed in template arguments for specialization?

泪湿孤枕 提交于 2019-12-18 17:04:57

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!