【发布时间】:2016-03-30 11:00:21
【问题描述】:
不幸的是,我对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";
用于在头文件中定义全局变量 如果我想“只使用”那些全局声明/定义的实体,不想考虑如何我使用它们?
【问题讨论】:
-
@JohnB:您可能希望将其标记为
constexpr char const * const kHello = "Hello";——在 c++11 中,constexpr意味着const,但在 c++14 中却没有。我不确定在这个问题上 C++14 中的 ODR 是否有很大不同,但无论如何,根据我的经验,你可以得到一个编译器警告。 -
@ChrisBeck 你在成员函数上混淆了
constexpr,在变量上混淆了constexpr。 -
这只是一个学术问题。实际上不会发生任何错误,因为(对于未内联对
inline函数的调用的情况)链接器只是在可丢弃的众多中选择一个任意(内联)函数定义,而单个 确实你想要什么。除非您有意引入对常量地址或此类愚蠢的依赖。也就是说,没有实际问题。 -
@Cheersandhth.-Alf 转发功能模板。是的,有,因为这将构成 odr 使用。 (如果你在内部进行,例如标题中的内联函数。)
-
@Columbo: 好吧,无论如何 :) 圣诞快乐。又是那个时候!哎呀。 OK,开始准备……
标签: c++ c++11 language-lawyer constexpr linkage