使用MSVC 2013初始化`static constexpr double`

时间:2014-05-04 09:15:29

标签: c++ visual-c++ c++11 visual-studio-2013 constexpr

标题说明了这一切,并且两种常用方法都不起作用。我错过了什么?

1

class Cl {
    static constexpr double PI;
};
constexpr double Cl::PI = 3.14;
  

(26):错误C2737:' private:static double const   氯:: PI' :' constexpr'对象必须初始化

2

class Cl {
    static constexpr double PI = 3.14;
};
  

(26):错误C2864:' Cl :: PI' :一个静态的   具有类内初始化程序的数据成员必须具有非易失性const   整体式
  type是' const double'

在两次尝试中,错误都在类中的同一行。我正在使用VisualStudio / MSVC 2013年11月的CTP编译器。

请注意,使变量const不是解决方案,因为我想在constexpr函数和普通函数中使用此常量。

2 个答案:

答案 0 :(得分:4)

根据Stephan T. L.在此blog中的表格和解释, constexpr 确实仅在VS Nov 2013 CTP中部分实施。

  

CTP支持C ++ 11 constexpr,但成员函数除外。   (另一个限制是不支持数组。)此外,它不支持   支持C ++ 14扩展的constexpr规则。

(希望将其放在评论中,但还没有足够的分数)

编辑:只是添加,在Herb的blog中,关于静态成员的问题几乎相同,但答案与Stephan相同。

我认为简单地说2013年11月CTP没有实现所需的OP功能(发送错误报告?)并等待2014年7月的CTP或VS Next(遗憾地),这是安全的。

答案 1 :(得分:1)

你无法真正“初始化”一个constexpr。正如关键字所暗示的那样,它是一个常量表达式,而不是变量。

您似乎只想在这里使用const

第二个例子中的编译器指出你不能使所有类型都为const-expr。

更新:这似乎是MSVC限制。

很高兴有责任。

确实,MSVC2010-2013中的C++11 support page mentions: 没有constexpr支持