Определение шаблонной переменной без inline
Есть заголовочный файл:
// a.hpp
template<typename T>
int a;
И два сырца:
// a.cpp
#include "a.hpp"
int main() {
std::cout << a<int> << '\n';
}
// b.cpp
#include "a.hpp"
auto&& b = (std::cout << a<int> << '\n');
Почему не происходит ошибки двойного определения и программа выводит два нуля? Я не указывал inline. В чём будет разница, если я укажу inline?
Ответы (2 шт):
Не будет никакой разницы - шаблон (template) сам по себе является inline, потому у вас все и работает.
Вас же не удивляет, что в такой же ситуации шаблонная функция без всякого inline не приводит к ошибке двойного определения?
Для шаблонов разрешается нарушение One Definition Rule (правило единственного определения) [basic.def.odr]:
There can be more than one definition of a
...
— templated entity,
Ведёт такой шаблон себя так как будто в программе имеется единственное определение этой сущности.
В свою очередь inline говорит следующее [dcl.inline]:
inline функция или переменная с внешней связностью имеет одинаковый адрес во всех единицах трансляции.
Т.о. добавление inline к определению шаблонной переменной ничего не меняет с точки зрения поведения.