为什么我不能在类中有一个非整数静态const成员?

我注意到C ++不会编译以下内容:


class No_Good {

  static double const d = 1.0;

};

但是,它很乐意允许将double更改为int,unsigned或任何整数类型的变体:


class Happy_Times {

  static unsigned const u = 1;

};

我的解决方案是将其更改为:


class Now_Good {

  static double d() { return 1.0; }

};

并认为编译器将足够聪明,可以在需要时进行内联...但是,这使我感到好奇。


为什么C ++设计人员可以让我将const静态地设置为int或unsigned,而不允许double?


编辑:我在Windows XP上使用Visual Studio 7.1(.net 2003)。


编辑2:


问题已经回答,但是为了完成,我看到的错误是:


error C2864: 'd' : only const static integral data members can be initialized inside a class or struct


人到中年有点甜
浏览 558回答 3
3回答

POPMUISE

我看不出技术原因struct type {    static const double value = 3.14;};是禁止的。您发现它可以工作的任何地方都是由于非便携式实现定义的功能。它们似乎也只有有限的用途。对于在类定义中初始化的整数常量,可以使用它们并将它们作为非类型参数传递给模板,并将它们用作数组尺寸的大小。但是对于浮点常量,您不能这样做。允许浮点模板参数会带来它自己的规则集,这确实不值得麻烦。但是,下一个C ++版本将允许使用constexpr:struct type {    static constexpr double value = 3.14;    static constexpr double value_as_function() { return 3.14; }};并且会做出type::value一个常量表达式。同时,最好的选择是遵循以下模式std::numeric_limits:struct type {    static double value() { return 3.14; }};它不会返回常量表达式(在编译时未知值),但这仅在理论上重要,因为实际情况下无论如何都将内联该值。请参阅constexpr建议。它包含4.4Floating-point constant expressions传统上,在编译时评估浮点常量表达式是一个棘手的问题。为了统一性和通用性,我们建议允许使用任何浮点常量表达式初始化的浮点类型的常量表达式数据。这还将增强与C99 [ISO99,§6.6]的兼容性,从而允许[#5]在多种情况下都需要一个计算结果为常量的表达式。如果在翻译环境中评估浮动表达式,则算术精度和范围至少应与在执行环境中评估表达式一样大。
打开App,查看更多内容
随时随地看视频慕课网APP