给出以下代码:
struct A { static constexpr int a[3] = {1,2,3}; };
int main () {
int a = A::a[0];
int b [A::a[1]];
}
Run Code Online (Sandbox Code Playgroud)
是A::a必然使用的ODR的int a = A::a[0]?
注意:这个问题代表了休息室辩论的一个不那么闷热/不合逻辑/无穷无尽的版本.
在C++ 1z中声明内存有效全局常量的最佳方法是什么,它不进行内部链接,因此在所有翻译单元中使用单个副本?
尽管在许多地方已经提到过,但我们没有任何单一的"最佳方法"问题和答案,所以在这里.以下是我找到相关问题的部分地方列表.
我在找为atleast所有基本基本类型的解决方案,如int,double,char,std::string.
编辑1: 最好的方式,我的意思是"记忆效率".我知道对于内部联系,每个翻译单元都会有多个副本,因此会占用内存.除此之外,如果我们能够实现快速的执行时间和编译时间,这将是伟大的,代码的美化(容易)并不重要.此外,我知道外部链接将增加获取时间,因为处理器可能会在运行时获得缓存未命中.但最新的C++语言是否支持所有这些的最佳方法?或者可能建议支持每个案例?
注意:对于std::string全局常量,最佳方法是什么?是否存在可变性会对有任何影响常量性?
如果我有一个foo.h包含的标题
#ifndef FOO_H_
#define FOO_H_
namespace foo {
constexpr std::string_view kSomeString = "blah";
}
#endif // FOO_H_
Run Code Online (Sandbox Code Playgroud)
那么在单个程序中包含foo.h多个.cc文件是否安全,无论它们对符号做什么kSomeString,或者是否存在可能导致ODR违规的一些用途?
此外,它是否保证kSomeString.data()将跨.cc文件返回相同的指针?
如果可能的话,我想特别引用C++标准中的措辞.谢谢!