为什么在类内初始化器中不允许使用 double 类型

12

我一直在阅读Herb Shutter的“Exceptional C++”,其中的“条款1:#define或const和内联”。

据说类内初始化只允许对于整型(整数,字符,布尔值)以及常量进行。

我想知道为什么双精度/浮点数不能在类声明中初始化。是否有特定的原因?

class EngineeringConstants {      // this goes in the class
 private:                          // header file
  static const double FUDGE_FACTOR;
  ...
 };
 // this goes in the class implementation file
 const double EngineeringConstants::FUDGE_FACTOR = 1.35;

我想知道为什么下面的声明不被允许:


class EngineeringConstants {      // this goes in the class
 private:                          // header file
  static const double FUDGE_FACTOR = 1.35;
  ...
 };

?

1个回答

18

这个说法已经过时了:在C++03中,不支持在类定义中使用double进行初始化。在C++(从2011版开始),您可以在类定义中初始化任意成员。而且,初始化不仅限于static成员,还可以初始化非static成员:

struct foo {
    static constexpr double value = 1.23;
    std::string   str = "foo";
};

在C++03中禁止使用浮点数初始化static成员的历史原因是编译期间的数字可能与执行期间的数字不同。例如,当在使用IEEE浮点数的平台上进行交叉编译并针对使用IBM十六进制浮点数的平台时,即使是在这两种数字系统中都可以表示的常量也可能得到不同的结果。


2
@computer:目前官方的C++标准是INCITS/ISO/IEC 14882-2011。早期版本可能仍在使用,但这并不意味着应以有趣的方式引用标准的_当前_版本。 - Dietmar Kühl
3
我认为它确实有害,因为它暗示了C++11与C++不同,但事实并非如此。C++与C++03有明显区别,我们应该标注过时的版本而不是当前版本!你改变答案中"C++"为"C++11"其实是有意为之的。 - Dietmar Kühl
1
@DietmarKühl:C++11意味着版本,而C++则不是。这会有什么影响吗? - Nawaz
1
@computer C++ 确实 暗示了当前的标准,否则它还能暗示什么呢?如果您想指定旧标准,那么可以明确说明(C++98、C++03、C++11一旦C++14发布...) - juanchopanza
1
@DietmarKühl:请记住,“当前版本”的定义随时间而变化。比如我在2022年阅读这个答案,想知道你所说的“当前版本”是指哪个版本的C++?我还想知道从哪个版本开始发生了改变?“C++”在2022年无法回答我的问题,但C++11可以澄清一切。 - Nawaz
显示剩余17条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接