关于C++:用MSVC 2013初始化in-class

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编译器。

注意,使变量const不是一个解决方案,因为我想在constexr函数和normal函数中都使用这个常量。


根据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

第二个示例中的编译器只是指出,不能将所有类型都设置为const expr。

更新:这似乎是MSVC限制。

  • GCC http://coliru.stacked-crooked.com/a/009b60ebda296730和
  • 克拉恩http://coliru.stacked-crooked.com/a/8b4e587450016441

乐意效劳。

实际上,C++ 11支持页面提到:在MSVC20102013中没有支持EDOCX1 1的支持。