为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
人到中年有点甜 2019-10-17 10:17:26
我注意到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
查看完整描述

3 回答

?
POPMUISE

TA贡献1765条经验 获得超5个赞

我看不出技术原因


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.4


Floating-point constant expressions


传统上,在编译时评估浮点常量表达式是一个棘手的问题。为了统一性和通用性,我们建议允许使用任何浮点常量表达式初始化的浮点类型的常量表达式数据。这还将增强与C99 [ISO99,§6.6]的兼容性,从而允许


[#5]在多种情况下都需要一个计算结果为常量的表达式。如果在翻译环境中评估浮动表达式,则算术精度和范围至少应与在执行环境中评估表达式一样大。


查看完整回答
反对 回复 2019-10-17
  • 3 回答
  • 0 关注
  • 557 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信