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

今天是学习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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值