使用static,const,constexpr进行全局声明/初始化

时间:2015-06-30 05:01:19

标签: c++ c++11

在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行之间是否存在差异?

2 个答案:

答案 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 具有值的常量表达式整数取决于那些操作中的结果并且无法修改