Initializing a `static constexpr double` with MSVC 2013
标题说,这一切和这两种通常的方式都不起作用。我错过了什么?
1。
1 2 3 4 | class Cl { static constexpr double PI; }; constexpr double Cl::PI = 3.14; |
(26): error C2737: 'private: static double const
Cl::PI' : 'constexpr' object must be initialized
2。
1 2 3 | class Cl { static constexpr double PI = 3.14; }; |
(26): error C2864: 'Cl::PI' : a static
data member with an in-class initializer must have non-volatile const
integral type
type is 'const double'
在两次尝试中,错误都在类内的同一行上。我正在使用VisualStudio/MSVC Nov 2013 CTP编译器。
注意,使变量
根据stephan t.l.在本博客中的表格和解释,constexpr实际上只在vs 2013年11月的CTP中部分实现。
The CTP supports C++11 constexpr, except for member functions.
(Another limitation is that arrays aren't supported.) Also, it doesn't
support C++14's extended constexpr rules.
(希望发表评论,但还没有足够的观点)
编辑:只是补充一下,在Herb的博客中,关于静态成员的问题几乎是相同的,但是回复和Stephan是一样的。
我认为可以简单地说,2013年11月CTP没有实现所需的操作功能(发送错误报告?)等待2014年7月的CTP或VsNext(可悲的是)。
不能真正"初始化"constexpr。正如关键字所暗示的,它是一个常量表达式,而不是变量。
看来你只是想在这里使用
第二个示例中的编译器只是指出,不能将所有类型都设置为const expr。
更新:这似乎是MSVC限制。
- GCC http://coliru.stacked-crooked.com/a/009b60ebda296730和
- 克拉恩http://coliru.stacked-crooked.com/a/8b4e587450016441
乐意效劳。
实际上,C++ 11支持页面提到:在MSVC20102013中没有支持EDOCX1 1的支持。