gpt4 book ai didi

c++ - 如果我只使用一个翻译单元使用 extern 模板类,为什么我不会收到链接错误?

转载 作者:太空狗 更新时间:2023-10-29 20:53:30 25 4
gpt4 key购买 nike

考虑以下代码:

#include <iostream>

template<typename T>
class X
{
public:
T t;

void func1() { std::cout << "Test"; }
void func2(T x) { }
};

extern template class X<int>;

int main()
{
X<int> x;
x.func1();
}

这段代码编译和链接正确(live)。

但是,我无法理解为什么由于 extern template class 声明而没有出现链接错误。根据cppreference.com (强调我的):

An explicit instantiation declaration (an extern template) skips implicit instantiation step: the code that would otherwise cause an implicit instantiation instead uses the explicit instantiation definition provided elsewhere (resulting in link errors if no such instantiation exists). This can be used to reduce compilation times by explicitly declaring a template instantiation in all but one of the source files using it, and explicitly defining it in the remaining file.

据我所知,extern template class 声明应该可以防止编译器在 main 中使用 T = int 隐式实例化 X。因为实际上不存在实例化,所以这会导致链接时错误。

为什么这个代码链接?

最佳答案

如评论中所述,链接器错误出现在 -O0 中,但随 -O2 消失。当您有显式实例化声明时,编译器会假设两全其美:定义可用,因此如果编译器想要内联它,它就可以。但是如果编译器不想内联它,它可以假定实际函数将在另一个翻译单元中生成。因此,如果编译器决定不内联该函数,您只会注意到显式实例化它的 promise 被打破了。

关于c++ - 如果我只使用一个翻译单元使用 extern 模板类,为什么我不会收到链接错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42427641/

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