Требуется ли диагностика для неправильного использования независимых имен в шаблоне, который никогда не создается?

Вот что стандартный говорит о независимых именах в определении шаблона:

Независимые имена, используемые в определении шаблона, обнаруживаются с помощью обычного поиска по именам и привязываются к месту их использования.

[Пример 1:

void g(double); 
void h();

template<class T> class Z { 
public:   
  void f() {
    g(1);           // calls g(double)
    h++;            // ill-formed: cannot increment function; this could be diagnosed
                    // either here or at the point of instantiation   
  } 
};

void g(int);        // not in scope at the point of the template definition, not considered for the call g(1) 

- конец примера]


Меня смущает комментарий к h++;, в котором говорится, что плохо сформировано: ... это может быть диагностировано либо здесь, либо в момент создания. Что, если реализация выберет последнее, но нет экземпляра шаблона? Где это будет диагностировано?

Означает ли это, что это на самом деле плохо сформировано, вместо этого не требуется диагностика?


person cigien    schedule 24.10.2020    source источник


Ответы (1)


Плохо сформированный отчет о недоставке - это частный случай плохо сформированного отчета о недоставке. В этом примере определение шаблона класса Z явно неверно сформировано; Требуется ли диагностика или нет, зависит от того, происходит ли создание экземпляра Z где-либо в блоке трансляции, что в примере кажется независимым (поскольку он допускает, что может существовать точка создания экземпляра). Если действительно существует создание экземпляра, то реализация имеет право выдавать диагностику либо в точке определения, либо в точке создания экземпляра. См. [temp.res.general] / 8.

person Brian Bi    schedule 25.10.2020
comment
Итак, этот маркер охватывает приведенный выше пример, верно? - person cigien; 25.10.2020
comment
@cigien Я считаю, что это предусмотрено как в 8.1, так и в 8.4, но я не разбираюсь в тонкостях этих двух пунктов. - person Brian Bi; 25.10.2020
comment
Это правда, 8.1 вроде бы это тоже покрывает. Думаю, это объясняет, но я ненадолго воздержусь от ответа. Спасибо :) - person cigien; 25.10.2020
comment
Подождите, IFNDR должен быть явно указан, верно? Разве IF не означает, что требуется диагностика? - person cigien; 25.10.2020
comment
@cigien В нормативной части текста да. Существует неявное требование диагностики всякий раз, когда в тексте говорится, что что-то неправильно сформировано. Таким образом, отчет о недоставке может быть неверно сформированным, только если эта часть отчета о недоставке явно указана. Примеры не являются нормативными, и я подозреваю, что автор этого примера просто не ожидал путаницы. - person Brian Bi; 25.10.2020
comment
хорошо, значит, комментарий в примере неправильный? так вы говорите, что пример не плохо сформирован? Ваш ответ говорит об обратном. - person cigien; 25.10.2020
comment
@cigien Пример неверный. Он либо плохо сформирован с требуемой диагностикой, либо плохо сформирован без необходимости диагностики (в зависимости от того, создан ли шаблон где-то еще в TU), оба из которых плохо сформированы. Однако, если в стандарте содержится какое-то предложение, например, if X, значит программа неверно сформирована, тогда мы должны не забыть читать ее как исключающую случай отчета о недоставке. - person Brian Bi; 25.10.2020
comment
Но я думаю, что это правило толкования не обязательно применимо к комментариям в примерах. - person Brian Bi; 25.10.2020
comment
А, похоже, в 13.8.1.10 действительно есть нормативный текст :) и лучший комментарий :) Последняя часть комментария выше просто неверна. - person cigien; 25.10.2020
comment
@cigien Этот абзац о другом. В этом примере имя находится в области видимости, просто операция, выполняемая с сущностью, которую оно обозначает, недопустима. - person Brian Bi; 25.10.2020
comment
О Конечно. Я думаю, легко проверить, входит ли имя в область видимости, но, оказавшись в области видимости, в целом может быть трудно понять, можно ли его каким-либо образом использовать. Спасибо, это помогло. Таким образом, отсутствие нормативного текста в любом случае означает, что это IFNDR. Это разумно. - person cigien; 25.10.2020
comment
Строго говоря, [temp.res] не применяется к f, потому что это не шаблон. См. CWG1253. - person Language Lawyer; 25.10.2020
comment
@LanguageLawyer Текст, упомянутый в CWG1253, значительно изменился. Делает ли дефект спорным? Я не могу сказать. - person cigien; 25.10.2020