Откуда g ++ (с -fno-implicit-templates) получает определения шаблонов, если я их явно не инстанцирую? - PullRequest
1 голос
/ 28 октября 2011

Следующий код работает.

/* 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

Я не получаю предупреждений, и он компилируется и работает нормально. У меня сложилось впечатление, что этого не должно произойти. Я использую gcc 4.4.5.

Ответы [ 2 ]

6 голосов
/ 28 октября 2011

Эта опция не предотвращает все экземпляры шаблона, только не встроенные:

-fno-implicit-templates Никогда не генерировать код для не встроенных шаблонов, которые создаются неявно (например, путем использования);только испускать код для явных реализаций.См. Шаблон Instantiation, для получения дополнительной информации.

Компилятор включает все функции-члены vector, используемые в вашем коде, поэтому компиляция завершается успешно.

При компиляции с этим параметром произойдет следующее, поскольку длявстроенный экземпляр:

#include <vector>

int main()
{
    auto f = &std::vector<int>::resize;
}
1 голос
/ 28 октября 2011

Согласно справочной странице:

   -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

...