C++对静态const积分类型有什么特殊规则?

Dre*_*ann 6 c++ standards static const

我的印象是C++将相同的特殊规则应用于static const整数类型,无论是在命名空间范围内声明还是在类/结构/联合中声明.

现在我想我已经被不合规的编译器教给了Bad Things.

static const int A = 1;

struct s
{
    static const int A = 1;
};
Run Code Online (Sandbox Code Playgroud)

除了明显的范围差异,如何做As::A有所不同?

  • ......当他们的用法被替换为他们的字面值?
  • ......什么时候可以拿到它的地址?
  • ......当我需要单独定义它们时?

我特别好奇C++ 03.

Jam*_*nze 6

关键字static在类范围和命名空间范围内并不意味着相同.实际上,它在命名空间范围中的使用已被弃用.

在类范围声明变量时,static意味着将有一个变量的单个实例,具有静态存储持续时间和生存期.类中的声明不是定义; 如果在可变使用,它必须在一个(且仅一个)的转换单元中定义; 如果未定义,则表示未定义的行为.(在实践中,根据不同的用途,要么一切都将正常工作,否则你会从连接出现错误.)请注意,如果该声明是一个const整体式,并包含一个初始化,它 认为是使用过,如果它是在需要常量积分表达式的上下文中使用(如C样式数组的维度).最简单和最可靠的事情就是在某处定义它.

在命名空间范围内声明变量时,static意味着该名称具有内部链接,而不是外部; 无论有没有static,声明都是一个定义(因此程序中不应该有其他定义).在C++ 03中,这个用法已被弃用; 请改用未命名的命名空间.另请注意,如果变量本身是const(顶级const),则默认情况下它具有内部链接,因此static无论如何都没有效果.(如果需要const具有外部链接的变量,使其成为类成员,或者显式定义它extern,使用初始化程序使其成为定义,而不仅仅是声明.)