c++ - inline 关键字对类成员模板函数的影响?

标签 c++ templates inline

我读过内联模板函数特化 here

除了要求 inline 关键字在 header 中实例化是合乎逻辑的,我找不到将非专用函数模板标记为 inline 是否有任何区别的答案> 在标题中?无论是成员函数还是普通函数。

请不要解释编译器如何比程序员更清楚,问题是:inline 关键字对 header 中的“解压”模板有意义吗?

非专用模板是否始终内联,因为它们位于标题中?对于下面的示例伪代码,如果我们假设 Foo::bar 方法可以很长或很短,则省略 inline 关键字或添加 inline关键字对编译器内联或不内联扩展函数的实际机会有什么影响?

这是反射(reflect)我的代码的成员函数模板示例:

class Foo
{
public:
    template<typename Type>
    static Type bar();
};

示例非内联定义:

template<typename Type>
Type Foo::bar()
{
    return Type();
}

示例内联定义:

template<typename Type>
inline Type Foo::bar()
{
    return Type();
}

上面的inline 关键字是总是无用的,还是只有当函数可以被编译器内联时才有意义?模板总是内嵌在标题中吗?

最佳答案

inline 关键字用于绕过 One Definition Rule , 不表示 inline substitution的函数调用。请注意,编译器仍然需要函数定义来执行内联替换,因此如果函数定义位于包含在不同文件中的头文件中,则您必须提供 inline

专用函数模板就像普通函数一样,因为所有模板参数都已固定(即,函数模板不能部分专用)。因此,如果(完全)专用函数模板在头文件中,您应该将其内联以处理同一个定义规则,就像处理普通函数一样。

关于c++ - inline 关键字对类成员模板函数的影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58757179/

相关文章:

c++ - Visual Studio 中的 std::initializer_list 歧义

c++ - 如何(不)重新运行 C++ 代码?

c++ - c++中模板的部分特化

html - 无法正确显示 HTML 文档中的元素

c++ - 当我尝试将一个信号连接到插槽时,Qt 代码无法编译

java - Qt on Android 运行时错误 : Invalid package identifier when getting bag for resource number 0x00000000

javascript - template.data._id 在 Meteor 中做什么?

c++ - 删除此保护互斥示例中的定义

c++ - 以下内容是否确实违反了 ODR?

Delphi 2010内联没用吗?