Шаблоны и ODR - PullRequest
       6

Шаблоны и ODR

0 голосов
/ 20 ноября 2018

Речь идет о документации C ++ и стандартной документации.Является ли в следующем коде переменная x odr-used?

extern int x;
template<class T> T f() { return x; }

Мне кажется, она не используется, но где это указано в документах?(есть утверждение, что появление x в выражении является odr-use, но ...)

1 Ответ

0 голосов
/ 20 ноября 2018

Используется для одр.[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.

...