我的印象是 C++ 将相同的特殊规则应用于 static const
整型regardless 是否声明于命名空间范围或在类/结构/union 内声明。
现在我在想我被不合规的编译器教坏了。
static const int A = 1;
struct s
{
static const int A = 1;
};
除了范围上的明显差异,A
和 s::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/