成员函数模板"inline"需要
Is "inline" needed with member function templates
如果我在非模板类中有一个成员函数模板,并且想在类外定义它,我必须使用"inline"吗?
示例:
class A
{
template <class D>
void someMethod(D param);
}
template <class D>
/* inline needed here? */ void A::someMethod(D param)
{
}
该标准第3.2.5节规定,功能模板不属于一个定义规则。在这方面,成员函数模板是函数模板吗?
编辑:链接器在没有内联的情况下不会抱怨,但它仍然是有效的C++03吗?
编辑:
到目前为止,我学到了什么:gcc(以及其他编译器)将隐式模板实例化导出为弱符号,这意味着如果它们在多个翻译单元中实例化,则在链接时不会发生冲突。由于弱符号不是标准的一部分-标准是否以某种方式隐含地要求模板实例化以这种方式运行?我是否可以期待其他符合标准的编译器/链接器组合也有同样的行为?
由于内联在优化时基本上被忽略,但允许在不同的转换单元中对函数进行多个定义,这隐含地转换为将这些函数导出为弱符号。这是否意味着将模板声明为inline是多余的?
无论成员函数模板是否为函数模板,它们肯定不是对象或非内联函数,因此不适用"一个定义规则"。
但它们实际上是函数模板,并且对于非成员函数模板特定的标准的其他应用程序也是如此。
inline
作为关键字向编译器建议,标记为这样的函数是具有相同名称的优化的良好候选者,为了帮助实现这种优化,它要求在每个使用函数的CU中以相同的方式定义函数(如果编译器看到代码,则更容易进行优化,即使链接器能够进行相同的优化,但20年前这还远不常见)。
您可能希望为函数模板提供此提示,从而在内联中标记函数模板定义。如果您不想给出这种提示,则不需要内联。
(曾经有一段时间,优化只考虑标记为内联的函数,但关键字还没有达到register
的命运,即通常被编译器忽略,除非它的形式意义是防止获取变量的地址)。
相关文章:
- 激励'inline'说明符的真实世界示例?
- C++中的"inline"关键字
- std::原子加载和存储都需要吗
- 需要帮助设置在C++中使用的Potrace
- 是否需要删除包含对象的"pair"?
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- C++我需要了解在哪里使用指针和双指针
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 当使用透明的std函数对象时,我们还需要写空的尖括号吗
- 我需要将多个函数组合为一个函数
- 概念中的cv限定符需要表达式参数列表
- 是否有类似std::lower_bound的函数,而不需要排序/分区输入
- 库函数需要一个 std::function<void(void)>,如何传入类函数?
- 需要从 istream 和 ostream 派生 iostream
- 我需要知道编译器如何在cpp中使用析构函数
- 为什么您需要C++头文件的包含保护
- 为什么静态内联变量需要"inline"?
- 成员函数模板"inline"需要