C++ 为什么这会拒绝枚举?

C++ 为什么这会拒绝枚举?,c++,c++11,C++,C++11,为什么这个代码会失败 #include <algorithm> int main() { int a[10]; enum { a_size = sizeof a / sizeof *a }; std::fill(a, a + a_size, a_size); } #包括 int main(){ INTA[10]; 枚举{a_size=sizeof a/sizeof*a}; 标准:填充(a,a+a_尺寸,a_尺寸); } G++4.1.2和4.4.3: 在函数“int

为什么这个代码会失败

#include <algorithm>
int main() {
  int a[10];
  enum { a_size = sizeof a / sizeof *a };
  std::fill(a, a + a_size, a_size);
}
#包括
int main(){
INTA[10];
枚举{a_size=sizeof a/sizeof*a};
标准:填充(a,a+a_尺寸,a_尺寸);
}
G++4.1.2和4.4.3:

在函数“int main()”中:
第5行:错误:对“fill(int[10],int*,main():)的调用没有匹配的函数”


此代码是否有效C++0x?

std::fill根据其对象参数的类型进行参数化;它不需要迭代器::value_类型的参数。因此,正如silico所说,C++03不能用本地类型实例化模板


但是,在C++0x中,您可以使用本地类型来实例化模板,因为它们具有外部链接。

@Naveen:应该拒绝的是无效的C++03,您是在0x模式还是非标准模式下编译的?如果可以的话;在模板参数部分甚至有一个类似的例子。(值是
sizeof…
会影响它吗?@Naveen:在C++03中无效,本地类型不能是模板参数。@Roger Pate:VS2008没有0x扩展名。我正在使用默认的编译器设置,不确定它是否是microsoft特定的扩展。@Naveen:实际上。VC++9.0中实现的C++0x特性之一是能够将本地类型和未命名类型作为模板参数。这就是为什么OP的代码在VS2008中工作,即使它不是有效的C++03。您这样做有什么特别的原因吗?你为什么不直接做
size\t a\u size=sizeof(a)/sizeof(*a)