c++ - C++ 对 static const 整数类型应用了哪些特殊规则?

标签 c++ static constants standards

我的印象是 C++ 将相同的特殊规则应用于 static const 整型regardless 是否声明于命名空间范围或在类/结构/union 内声明。

现在我在想我被不合规的编译器教坏了。

static const int A = 1;

struct s
{
    static const int A = 1;
};

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

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

我对 C++ 03 特别感兴趣。

最佳答案

static 关键字在类作用域中的含义不同 并在命名空间范围内。事实上,它在命名空间范围内的使用是 已弃用。

在类范围内声明变量时,static 表示 将有一个变量实例,带有静态 储存时间和生命周期。类内声明 不是定义;如果变量被使用,它必须是 在一个(且只有一个)翻译单元中定义;如果不是 定义,你有未定义的行为。 (在实践中,取决于 在使用上,要么一切正常,要么你会得到一个 来自链接器的错误。)请注意,如果声明是 一个 const 整数类型,并包含一个初始化,它是 如果在需要的上下文中使用,则被视为已使用 常数积分表达式(如 C 风格的维度 大批)。最简单和最确定的事情就是定义它 某处。

在命名空间范围内声明变量时,static 表示 该名称具有内部链接,而不是外部链接;和 或者没有static,声明是一个定义(所以有 程序中应该没有其他定义)。在 C++03 中,这 不推荐使用;改用未命名的命名空间。注意太 如果变量本身是 const(顶级常量),那么 它默认有内部链接,所以 static 没有 有什么作用。 (如果你需要一个 const 变量 外部链接,使其成为类成员,或定义它 显式 extern,使用初始化器来实现 一个定义,而不仅仅是一个声明。)

关于c++ - C++ 对 static const 整数类型应用了哪些特殊规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13936365/

相关文章:

c++ - 找出最大、最小、正数和负数

c++ - 如何使用 fstream 从第二行读取文本文件?

c++ - C++中全局变量和静态成员变量动态初始化的实现

c - extern 和 static 的正确用法是什么?

c - `const T *restrict` 能保证指向的对象没有被修改吗?

c# - 如何在 C# 中将类实例声明为常量?

c++ - 是否允许符合标准的 C++ 编译器优化 <= 0 上的无符号整数分支?

c++ - 删除数组中指针的正确方法是什么?

c - 使用函数调用初始化静态变量会产生编译错误?

const 和非 const 容器的 C++ 自定义迭代器