【问题标题】:Initializing a `static constexpr double` with MSVC 2013使用 MSVC 2013 初始化“static constexpr double”
【发布时间】:2014-06-20 16:39:54
【问题描述】:

标题说明了一切,两种常用方法都行不通。我错过了什么?

1.

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

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

2.

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

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

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

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

【问题讨论】:

  • 2.应该管用。但是放弃虚假的:
  • @juanchopanza 这是一个复制/粘贴错误。在我的代码中,: 之后有一个超类。
  • 无论如何,2.应该可以工作。
  • 有点离题,但M_PI 已在<cmath> 中定义。
  • @Edward 是的,PI 只是一个例子。

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


【解决方案1】:

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

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

(想放入cmets,但积分还不够)

编辑:只是补充一下,在 Herb 的blog 中,关于静态成员的问题几乎相同,但回复与 Stephan 相同。

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

【讨论】:

  • +1 好答案(具有讽刺意味的是,异常并没有完全涵盖 OP 的用例,但是嘿,我们不能指望 MSVC 编译器中的损坏功能的详尽列表!(拯救树木)
  • 同意@sehe 评论,我们没有真正有效的所有dos 和don'ts,所以我们在这里处于灰色地带(没有正确答案) .
【解决方案2】:

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

您似乎只想在这里使用const

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

更新:这似乎是 MSVC 的限制。

很乐意提供帮助。

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

【讨论】:

  • 当然可以,但是 3.14 是一个常量变量,对吧?我想在 constexpr 函数中使用它。
  • ^ 见编辑。这是一个字面量,好吧,但它不是 non-volatile const integral type,根据需要。
  • 也许吧。不过,这并不是一个真正的答案:-/
  • 你怎么知道这是一个错误?
  • 我使用的是 Nov2013 CTP,据说它支持 constexpr。无论如何,我猜他们只是在某些情况下实现了它。
猜你喜欢
  • 2020-09-20
  • 1970-01-01
  • 1970-01-01
  • 2011-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-10
  • 1970-01-01
相关资源
最近更新 更多