Lor*_*ins 9 c++ templates c++17 c++20
当头文件包含如下所示的模板变量时会发生什么:
template <class T>
std::map<T, std::string> errorCodes = /* some initialization logic */;
Run Code Online (Sandbox Code Playgroud)
这个变量使用安全吗?对此进行了一些研究,我发现:
inline改变了规则,但 c++20 有不同的行为(?)那么是哪一个呢?
模板从单一定义规则[basic.def.odr]/13中得到一个例外:
程序中可以有多个模板化实体 ([temp.pre]) [...] 的定义,前提是每个定义出现在不同的翻译单元中,并且这些定义满足以下要求。
那里有很多要求,但基本上,如果您在标头中有一个变量模板(变量模板是一种模板化实体)并且只包含来自多个翻译单元的标头,那么它们将具有相同的标记对标记相同定义(因为#include),所以有多个定义就可以了。
这与您不需要inline在标头中声明函数模板,但需要声明常规函数的原因相同inline。
在 C++17 中,这样的措辞如下:
类类型、枚举类型、具有外部链接的内联函数([dcl.inline])、具有外部链接的内联变量([dcl.inline])、类模板、非静态函数模板可以有多个定义,类模板的静态数据成员、类模板的成员函数或程序中未指定某些模板参数([temp.spec]、[temp.class.spec])的模板专业化,前提是每个定义都出现在不同的翻译单位,并且定义满足以下要求。
请注意,变量模板不在该列表中,这只是一个遗漏(它总是旨在工作)。这是2019 年通过的CWG 2433,但作为缺陷报告 (DR),因此我不会将其视为 C++20 更改。这是引入我之前引用的“模板化实体”项目符号的 DR(而不是手动列出几种不同类型的模板化实体,然后遗漏了一个)。
| 归档时间: |
|
| 查看次数: |
1026 次 |
| 最近记录: |