Oto, co standardowy mówi o nazwach nie zależnych w definicji szablonu:

Nazwy niezależne używane w definicji szablonu znajdują się przy użyciu zwykłego wyszukiwania nazw i związanych w momencie stosowania.

[Przykład 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) 

- Końcowy przykład]


Jestem zdezorientowany przez komentarz na h++;, który mówi " źle utworzone: ... Można tu zdiagnozować tutaj lub w punkcie instancji ". Co jeśli wystąpi realizacja, ale nie ma instancji szablonu? Gdzie to się zdiagnozowano?

Czy to znaczy, że jest to w rzeczywistości źle utworzone, nie wymaga diagnostyki zamiast tego?

4
cigien 25 październik 2020, 02:36

1 odpowiedź

Najlepsza odpowiedź

Illformed NDR jest specyficznym przypadkiem źle utworzonego. W przykładzie definicja szablonu klasy Z jest źle utworzona; Niezależnie od tego, czy wymagana jest diagnostyka, zależy od tego, czy instancja Z występuje w dowolnym miejscu w jednostce tłumaczeniowej, którą przykład pojawia się agnostyczny (ponieważ przyznaje, że może istnieć punkt instancji). Jeśli istnieje rzeczywiście instancja, wdrożenie ma wolność wydania diagnostyki w punkcie definicji lub w punkcie instancji. Zobacz [temp.res.general] / 8.

3
Brian Bi 25 październik 2020, 00:35