关于std数组和内置数组初始化的疑惑

来源:互联网 发布:淘宝店铺整体托管 编辑:程序博客网 时间:2024/05/21 21:38

今天是学习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不能用的深层原因有待分析,起码问题是解决了,哈哈。

0 0
原创粉丝点击