头文件和odr中的constexpr全局常量

约翰·B

不幸的是,我constexpr对头文件中声明的全局常量和odr感到困惑

简而言之:我们可以从这里得出结论吗

https://isocpp.org/files/papers/n4147.pdf

constexpr MyClass const MyClassObj () { return MyClass {}; }
constexpr char const * Hello () { return "Hello"; }

优于

constexpr MyClass const kMyClassObj = MyClass {};
constexpr char const * kHello = "Hello";

如果要“仅使用”那些全局声明/定义的实体,又不想考虑如何使用它们,则可以在头文件中定义全局变量

哥伦布

注意:从C ++ 17开始,您可以将变量声明为inline


TL; DR:如果希望(非常)安全,请使用constexpr函数。但是,这并不是固有的必要,如果您对这些对象执行琐碎的操作并且仅对它们的值感兴趣,或者根本不在下面列出的危险情况下使用它们,则肯定不是必需的。

根本的问题是,const名称空间范围内的变量(例如您的变量)通常具有内部链接([basic.link] /(3.2))。这意味着编译对应头的每个翻译单元将观察到不同的实体(即符号)。

现在想象一下,使用这些对象的标头中有一个模板或内联函数。ODR在这种情况下非常精确- [basic.def.odr] / 6

在此处输入图片说明

因为我们在说,所以肯定会遇到“用常量表达式初始化”constexpr所以是“的对象具有在所有定义相同的值D有关,如果你没有猴子。

“对象不被滥用”可能是唯一可疑的条件。基本上,它要求您不必将变量运行时作为符号存在,这反过来意味着

  • 您不会将其绑定到引用(=>您不会转发它!)

  • 您不(既不明确也不隐含)获取其地址。

第二个规则的唯一例外是数组,只要产生的glvalue不违反以上两个规则,就可以将其作为下标操作中的隐式地址。

更确切地说,odr的使用由[basic.def.odr] / 3决定

一种可变x其名称显示为潜在评估表达ex是ODR-使用ex,除非将所述左值到右值转换(4.1),以x产率即不调用任何非平凡函数和一个常量表达式(5.20),如果x是objectex是表达式的一组潜在结果的元素e,其中将lvalue-r -value转换(4.1)应用于e,或者e是舍弃值表达式(第5章)。

将ltr应用于任何constexpr变量将按照第一部分的要求进行操作。第二部分要求将变量用作而非实际对象; 也就是说,根据上述经验法则,最终将其丢弃或直接评估。

如果您避免在内联函数,模板等内部使用odr,则可以。但是,如果您使用相应constexpr函数的返回值,则不必担心,因为prvalue已经表现得更像值/文字(不是对象),并且constexpr函数是内联的,并且绝对不会违反ODR(如果您不要constexpr在其中使用变量!)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在头文件中隐藏函数和全局变量

来自分类Dev

如何访问头文件中定义的常量?

来自分类Dev

在头文件中声明全局const对象

来自分类Dev

在Windows中全局存储C ++头文件

来自分类Dev

头文件中的全局变量

来自分类Dev

在头文件或C源文件中声明全局变量

来自分类Dev

头文件中定义的常量浮点数**

来自分类Dev

在头文件中定义PHP常量不起作用?

来自分类Dev

共享常量的头文件或库?

来自分类Dev

jni中的头文件和源文件

来自分类Dev

没有extern的头文件中的全局变量

来自分类Dev

为什么即使使用#ifndef HEADER_H也不能在头文件中声明和分配全局变量

来自分类常见问题

可以在头文件中使用lambda违反ODR吗?

来自分类Dev

在Matlab中使用Calllib从C头文件获取常量和枚举值

来自分类Dev

在Matlab中使用Calllib从C头文件获取常量和枚举值

来自分类Dev

在头文件中声明extern结构模板,以在c文件中全局使用

来自分类Dev

CMake和子文件夹中的头文件问题

来自分类Dev

头文件中的内联函数可以使用具有内部链接的常量吗?

来自分类Dev

错误C2059:尝试在已知大小的头文件中创建Qt容器时为“常量”

来自分类Dev

.hpp和.cpp文件中的常量数组

来自分类Dev

C中的头文件

来自分类Dev

Anjuta中的头文件

来自分类Dev

Anjuta中的头文件

来自分类Dev

在C ++中链接结构和函数而无需头文件

来自分类Dev

头文件C ++中的声明和初始化太多

来自分类Dev

头文件中未初始化的全局变量的行为

来自分类Dev

为什么C头文件中的全局变量定义有效?

来自分类Dev

为什么我不能在头文件中定义全局函数?

来自分类Dev

我在哪里可以在c程序中声明全局变量,无论是在头文件中还是在源文件中

Related 相关文章

热门标签

归档