今天是学习meyers大师的新作《Effective Modern C++》第一天,看到第一节时好奇在VS2015跑了一个程序,如下:
#include<iostream>
using namespace std;
template<typename T, size_t N>
constexpr size_t getsize(T(&)[N])
{
return N;
}
int main()
{
int name[] = { 1,3,5,7,9 };
array<int, getsize(name)>names;
cout<<getsize(names);
return 0;
}
在这处:
array<int, getsize(name)>names;
显示“”表达式必须含有常量值“”,但是将std数组改为内置数组后:
int names[getsize(name)];
编译通过。这就迷惑了。我用的模板返回值是constexpr的啊,返回值应该可以在编译时确定,然而std数组却“不认可”我提出的请求。原因暂时没想明白。记录一下,权当我的第一篇博客吧。
第二天更新。有了解决方法,就是再添加一行:
constexpr size_t size = getsize(name);
然后用main函数里定义的这个size传递给array,代替getsize函数,就可以了。分析原因是可能我虽然定义了模板,并声明称constexpr的,但是在main函数里的array身上失去了该属性,编译器并没有认为这是一个常量表达式。好吧,关于内置数组能用而std::array不能用的深层原因有待分析,起码问题是解决了,哈哈。