gpt4 book ai didi

C++ 模板函数自动静态? (不,他们不是)

转载 作者:搜寻专家 更新时间:2023-10-31 01:41:01 27 4
gpt4 key购买 nike

当你写一个模板函数(或成员)时,你必须在头文件中写主体。这是非常有意义的,因为模板本质上是对编译器的指令,说明如何根据初始化前未知的类型动态创建函数。

我的问题与一个定义规则有关,如果我在两个不同的文件中初始化具有相同类型的模板(例如 typename T 变为 int)并且我将它们链接在一起我没有多重定义错误。

这是什么原因?模板函数是否隐式静态,因此在其编译单元之外不可见?

还是另有原因?

回答:不,他们不是。它们是单一定义规则的异常(exception)。

最佳答案

该标准在模板的单一定义规则中包含一个特殊的异常(exception)。

N4140,强调我的:

3.2 One definition rule [basic.def.odr]

6 There can be more than one definition of a class type (Clause 9), enumeration type (7.2), inline function with external linkage (7.1.2), class template (Clause 14), non-static function template (14.5.6), static data member of a class template (14.5.1.3), member function of a class template (14.5.1.1), or template specialization for which some template parameters are not specified (14.7, 14.5.5) in a program provided that each definitionappears in a different translation unit, and provided the definitions satisfy the following requirements. [...]

以下要求有效地说明所有定义都必须相同,但我假设它们在您的代码中。

根据这个程序的运行情况,您可以看出模板函数既不是隐式内联 也不是隐式静态:

抄送:

template <typename T> T f();
int main() { return f<int>(); }

抄送:

template <typename T> T f() { return T(); }
template int f();

如果模板是隐式inline,则该程序将无效,因为必须在使用它的每个翻译单元中定义inline 函数。

如果模板是隐式的static,这个程序将是无效的,因为在b.cc 中的定义将找不到与a.cc 中的声明匹配

关于C++ 模板函数自动静态? (不,他们不是),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28916602/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com