Используется для одр.[basic.def.odr] / 2:
Выражение потенциально оценивается , если оно не является неоцененным операндом или его подвыражением.
Таким образом, выражение x
является потенциально оцененным .
[basic.def.odr] / 4:
Переменная x
, имя которой отображается в виде потенциально вычисляемого выражения ex
, используется odr-используется на ex
, если только не применяется преобразование lvalue-в-значение ([conv.lval]) в x
возвращает константное выражение ([expr.const]) [...]
Мы можем остановиться здесь.Применение преобразования lvalue-to-rvalue в x
не дает постоянного выражения.
Это нарушение ODR не требует диагностики ([basic.def.odr] / 10):
Каждая программа должна содержать ровно одно определение каждой не встроенной функции или переменной, которая используется в этой программе с помощью odr, кроме исключенного оператора;Диагностика не требуется.
Даже если предположить, что f
не использует odr x
до тех пор, пока не будет создана специализация, это все равно не поможетпрограмма, потому что программа также является неправильно сформированной отчет о недоставке, если «для шаблона не может быть сгенерирована действительная специализация» ([temp.res] / 8), и поскольку каждая действительная специализация f
, несомненно, использует odr x
,действительная специализация не может быть сгенерирована, если в программе отсутствует определение x
.