gpt4 book ai didi

c++ - 模板化类的方法是否隐含内联链接?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:07:46 26 4
gpt4 key购买 nike

模板化类的方法是否隐含了内联链接(不是谈论内联优化),还是只是模板化方法?

// A.h

template<typename T>
class A
{
public:
void func1(); // #1
virtual void func2(); // #2
template<typename T2> void func3(); // #3
};

template<typename T>
void A<T>::func1(){} // #1

template<typename T>
void A<T>::func2(){} // #2

template<typename T>
template<typename T2>
void A<T>::func3<T2>(){} // #3

以上情况都是inline [linkage]吗? (我应该为它们中的任何一个显式地编写 inline 吗)?

最佳答案

如果模板函数和模板类的成员函数被隐式实例化,则它们是隐式内联的1,但要注意模板特化不是。

template <typename T>
struct test {
void f();
}
template <typename T>
void test<T>::f() {} // inline

template <>
void test<int>::f() {} // not inline

由于缺乏更好的引述:

A non-exported template must be defined in every translation unit in which it is implicitly instantiated (14.7.1), unless the corresponding specialization is explicitly instantiated (14.7.2) in some translation unit; no diagnostic is required


1 仅在允许对它们进行多个定义的意义上,但不允许用于优化目的。您可以手动将它们标记为 inline 作为优化器的提示。

参见 [basic.def.odr]/13.4 - 模板本身免于 ODR,不是因为它们是隐式内联

关于c++ - 模板化类的方法是否隐含内联链接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11527415/

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