如果我不显式地实例化模板,那么g++(带-fno-implicit-templates)从哪里获得模板定义呢?

Where does g++ (with -fno-implicit-templates) get template definitons from, if I dont explicitly instantiatie them?

本文关键字:-fno-implicit-templates 定义 g++ 实例化 如果 那么      更新时间:2023-10-16

下面的代码可以工作。

/* hello.cc */
#include <iostream>
#include <vector>
void vec_print()
{
    std::vector<int> is(10, 1);
    for (size_t i = 0; i < is.size(); ++i)
        std::cout << is[i] << " ";
    std::cout << std::endl;
}
/* main.cc */
void vec_print();
int main()
{
    vec_print();
}

当我加上

g++ -fno-implicit-templates -Wall -Wextra -c hello.cc
g++ -fno-implicit-templates -Wall -Wextra -c main.cc
g++ hello.o main.o -o hello

我没有得到任何警告,它编译并运行良好。我的印象是这不应该发生。

该选项不阻止所有模板实例化,只阻止非内联模板实例化:

-fno-implicit-templates永远不要为隐式(即通过use)实例化的非内联模板发出代码;只发出显式实例化的代码。有关更多信息,请参见模板实例化。

编译器内联了代码中使用的所有vector成员函数,因此编译成功。

当使用该选项编译时,以下代码将失败,因为它需要非内联实例化:

#include <vector>
int main()
{
    auto f = &std::vector<int>::resize;
}

根据手册:

   -fno-implicit-templates
       Never emit code for non-inline templates which are instantiated implicitly (i.e. by use); only emit code for explicit instantiations.

现在在您的示例中,您正在实例化类型,然后调用在类模板定义内定义的方法,因此隐式inline

你可以试试:

template <typename T>
void noop( T const & ) {}
int main() {
   noop(1);
}

然后用g++ -fno-implicit-templates -o test test.cpp