在C ++或C ++ 11中,对于以下声明//初始化,
// global scope
const int a = 1; // line 1
static const int b = 2; // line 2
constexpr int c = 3; // line 3
static constexpr int d = 4; // line 4
constexpr int e = a + b + c*d; // line 5
static constexpr int f = a - b - c*d; // line 6
This question表示在文件范围内,C ++中第1行和第2行之间没有区别。 3号线和4号线怎么样?
第4行和第5行之间是否存在差异?
第5行和第6行之间是否存在差异?
答案 0 :(得分:7)
不,应该没有任何区别(当然除了它们的值)因为constexpr和const意味着内部联系:
[C++11: 3.5/3]:
具有命名空间范围的名称(3.3.6)如果名称为,则具有内部链接
- 显式声明为
static
的变量,函数或函数模板;或者,- 明确声明的变量
const
或constexpr
且既未明确声明extern
也未声明{有外部联系;或- 匿名工会的数据成员。
答案 1 :(得分:0)
static
个变量static
对于这样的函数很有用:
void func (int i) {
int var = i;
}
当函数完成执行其代码时,其对象会自动销毁
为防止这种情况,您可以使用static
void func (int i) {
static int var = i;
}
这意味着当函数完成执行其代码时,定义为static的对象将保留,直到程序结束
const
适用于变量,并阻止在代码中修改它们。
并且constexpr
用于常量表达式,这两个是只读的,这意味着一旦初始化一个值就无法修改
这两者的区别在于:
static constexpr int d = 4; // line 4
constexpr int e = a + b + c*d;
static constexpr int d = 4
中的是我们定义一个名为d的变量,它是一个静态常量表达式整数,值为4,不能修改并保留到程序结束
并且在constexpr int e = a + b + c*d;
中我们定义了一个变量名e
具有值的常量表达式整数取决于那些操作中的结果并且无法修改