Статус несовместимых шаблонных специализаций между единицами перевода? - PullRequest
4 голосов
/ 20 марта 2020

Пожалуйста, рассмотрите следующую программу:

ФАЙЛ AH

template <typename T> struct C { static constexpr int x = 42; };

ФАЙЛ ЧД

#include "A.H"

template <> struct C<int> { static constexpr int x = 43; };

ФАЙЛ A. CC

#include "A.H"

void a() { std::cout << C<int>::x; }

ФАЙЛ B. CC

#include "B.H"

void b() { std::cout << C<int>::x; }

ГЛАВНАЯ ФАЙЛА. CC

void a(); void b();

int main() { a(); b(); }

Каков статус этой программы? Является ли он плохо сформированным, плохо сформированным без требуемой диагностики c, проявляет ли он неопределенное поведение, или ничего из вышеперечисленного (это нормально)?

Если ничего из вышеперечисленного, каков результат программа?

Если что-то из перечисленного выше нарушает, какое правило оно нарушает?

(Кроме того, будет ли ответ другим, если BH содержит частичную специализацию, а не явную специализацию?)

1 Ответ

7 голосов
/ 20 марта 2020

Это [temp.arg.template] / 2 :

Если специализация не видна в момент создания и была бы выбрана, если бы она была видна, программа плохо сформирована, диагностика не требуется c.

Специализация для C<int> не отображается в определении a(), но была бы выбрана если бы это было.

Но что еще более важно, это лимерик (расстояние между шахтами):

При написании специализации
будьте осторожны с его местоположением;
или заставить его скомпилировать
будет таким испытанием
, что разжечь его самосожжение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...