2012-02-15 6 views
9

Powinniśmy (powinniśmy) wiedzieć, że standardowe biblioteki C++, w tym std :: string, nie powinny być dziedziczone. Mimo to C++ 98/03 pozwoliło nam to zrobić, nawet jeśli prowadziło to do błędów.Czy standardowe kontenery C++ 11 są "ostateczne"?

Teraz, słowo kluczowe final jest dostępny, to te standardowy kontener biblioteka oznaczone final aby zapobiec złe użycie dziedziczenia z nimi?

Jeśli nie, dlaczego tak jest?

Odpowiedz

13

LWG omówiła tę kwestię na ostatnim spotkaniu w Kona 6-10 lutego 2012 r. Jest to LWG issue 2113.

LWG zdecydowało o oznaczeniu LWG 2113 jako NAD (bez usterki), z uzasadnieniem, że norma jest już jasna, że ​​istniejące klasy, takie jak kontenery i std::string, nie mogą zostać oznaczone jako ostateczne po wdrożeniu.

Dyskusja obejmowała fakt, że choć może się wydawać niezadowoloną z takich zajęć, jest to oczywiście zgodne z prawem w C++ 98/03. A uczynienie tego nielegalnym w C++ 11 złamałoby zbyt wiele kodu.

Aktualizacja

W tej chwili nie ma typy bibliotek w current working draft są oznaczone final.

+0

Dzięki za naprawienie typu Jerry. Miałem go w dwóch miejscach i po prostu naprawiłem drugi. Nie zauważyłbym tego bez twojej pomocy. –

+0

Z pewnością. Przepraszam, że tęskniłem za drugim. –

2

std::string nie wydaje się oznaczony jako ostateczny, ani inne pojemniki.

Zgaduję, dlaczego tak się dzieje, chociaż generalnie nie zaleca się ich, nikt nie był do końca pewny, jak bardzo działałby kod, gdyby był zabroniony.

Należy również zwrócić uwagę, że z tego, co warto, final nie jest technicznie słowem kluczowym - jest to identyfikator, do którego dołączone jest specjalne znaczenie, ale tylko w określonych okolicznościach. Kod, który zawierał coś takiego jak int final; final = 1;, nadal będzie działał. Jest to głównie ze względu na kompatybilność wsteczną - przynajmniej w nowym kodzie prawie na pewno lepiej jest używać tylko specjalnego znaczenia, a nie zwykłego identyfikatora.

+2

Nie zgadzam się z ostatnim zdaniem. Chodzi o to, aby nie być słowem kluczowym, aby móc używać słów kluczowych opartych na kontekście. Nie jest mylące mówienie "int final"; w kontekście wiemy dokładnie, co to znaczy, więc nie ma problemu. Zamieszanie wystąpiłoby tylko z "słowami kluczowymi", które mogą pojawić się w tym samym miejscu co wyrażenia. I tak nie jest w tym przypadku. –

+0

@NicolBolas Jeśli Twoim celem jest tylko obsługa znaczników składni zawierających prawie pełny kompilator C++, to z pewnością. Jeśli jednak unikasz używania słów kluczowych kontekstowych w innych kontekstach w przyszłym kodzie, wyróżnianie składni może być dokładne, nie wymagając prawie takiej samej złożoności. – Yakk

Powiązane problemy