gpt4 book ai didi

c++ - 为什么我不能在类中有一个非整数静态常量成员?

转载 作者:太空狗 更新时间:2023-10-29 23:14:49 25 4
gpt4 key购买 nike

我注意到 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++ 设计者允许我将 static 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

最佳答案

问题是对于整数,编译器通常不必为常量创建内存地址。它在运行时不存在,每次使用它都会内联到周围的代码中。它仍然可以决定给它一个内存位置——如果它的地址曾经被占用(或者如果它通过 const 引用传递给一个函数),它必须这样做。为了给它一个地址,它需要在一些翻译单元中定义。在这种情况下,您需要将声明与定义分开,否则它会在多个翻译单元中定义。

使用没有优化的 g++ (-O0),它会自动内联常量整数变量,但不会内联常量 double 值。在更高的优化级别(例如 -O1),它内联常量 double 。因此,以下代码在 -O1 编译,但在 -O0 不编译:

// File a.h
class X
{
public:
static const double d = 1.0;
};

void foo(void);

// File a.cc
#include <stdio.h>

#include "a.h"

int main(void)
{
foo();
printf("%g\n", X::d);

return 0;
}

// File b.cc
#include <stdio.h>

#include "a.h"

void foo(void)
{
printf("foo: %g\n", X::d);
}

命令行:

g++ a.cc b.cc -O0 -o a   # Linker error: ld: undefined symbols: X::d
g++ a.cc b.cc -O1 -o a # Succeeds

为了获得最大的可移植性,您应该在头文件中声明您的常量,并在某个源文件中定义它们一次。没有优化,这不会损害性能,因为你无论如何都没有优化,但是启用优化后,这会损害性能,因为编译器不能再将这些常量内联到其他源文件中,除非你启用“整个程序优化” .

关于c++ - 为什么我不能在类中有一个非整数静态常量成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31951248/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com