【发布时间】:2017-08-31 18:02:21
【问题描述】:
在 C++11 标准中,constexpr 和 static constexpr 全局变量在头文件中定义时有什么区别?更具体地说,当多个翻译单元包含相同的标头时,哪个声明(如果有)可以保证在翻译单元中定义相同的变量?
例如,
cexpr.h:
#ifndef CEXPR_H
#define CEXPR_H
constexpr int cint = 1;
static constexpr int scint = 1;
#endif
a.cpp:
#include "cexpr.h"
b.cpp:
#include "cexpr.h"
【问题讨论】:
-
没有区别。
constexpr暗示const。const暗示static。 -
无:变量上的
constexpr暗示const,命名空间范围内的 const 整型变量默认具有内部链接。 -
@cpplearner:尼特:我不会说“const 意味着静态”,因为
extern const int是有效的,但extern static const int不是——所以static没有那么多“隐含”,因为它是某种“默认”。 -
@KerrekSB 为了确保我理解,
constexpr和static constexpr都不允许我在不同的翻译单元中获得相同的对象? -
@Danra:在 C++14 中,不,你必须使用
extern const int代替(它仍然适合作为定义它的 TU 中的常量表达式,因为你需要一个初始化器可用作常量表达式)。在 C++17 中,您将使用inline constexpr int a = 10;来获取单个对象。
标签: c++ c++11 constexpr linkage