VS2015中,{1,2,3}能转换成constexpr std::initializer_list吗?
我看到vs2015中的std::initializer_list已经声明成constexpr了。
那么
template<class T>
constexpr bool assert_elementof(std::initializer_list<T> v, int N)
{
//static_assert(N == v.size(),"xxx");
return N == v.size();
}
int main()
{
constexpr int v[] = { 1,2,3 };
static_assert(assert_elementof<int>(std::initializer_list<int>(v, v + sizeof(v) / sizeof(v[0])), 3), "eee");
//static_assert(assert_elementof<int>({ 1,2,3 }, 3), "eee");
return 0;
}
我的是问题,为什么上面两处注释掉的代码不能在VS2015下编译通过?是我的代码有问题呢,还是VS2015的问题。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
关于
由于static_assert的第一个参数必须是一个const表达式,对于constexpr bool assert_elementof(std::initializer_list<T> v, int N),只有当两个参数都是const的时候,他的返回值才是const。所以两个参数{ 1,2,3 }, 3都是常量,所以这一段没有问题。
关于
去掉那个注释为什么就不行了,因为N是一个变量,不是一个常量表达式,所以违反static_assert的要求:第一个参数必须是一个const表达式。
c++ primer里面有一段摘录如下:
不报错的原因参考这里
应该没问题,记得加头文件