Определение шаблонной переменной без 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 шт):

Автор решения: Mikhailo

Не будет никакой разницы - шаблон (template) сам по себе является inline, потому у вас все и работает.

Вас же не удивляет, что в такой же ситуации шаблонная функция без всякого inline не приводит к ошибке двойного определения?

→ Ссылка
Автор решения: αλεχολυτ

Для шаблонов разрешается нарушение One Definition Rule (правило единственного определения) [basic.def.odr]:

There can be more than one definition of a
...
templated entity,

For each such entity and for D itself, the behavior is as if there is a single entity with a single definition

Ведёт такой шаблон себя так как будто в программе имеется единственное определение этой сущности.

В свою очередь inline говорит следующее [dcl.inline]:

An inline function or variable with external or module linkage has the same address in all translation units.

inline функция или переменная с внешней связностью имеет одинаковый адрес во всех единицах трансляции.

Т.о. добавление inline к определению шаблонной переменной ничего не меняет с точки зрения поведения.

→ Ссылка