Szablony C ++ są znane z generowania długich, nieczytelnych komunikatów o błędach. Mam ogólne pojęcie, dlaczego komunikaty o błędach szablonów w C ++ są tak złe. Zasadniczo problem polega na tym, że błąd nie jest wyzwalany, dopóki kompilator nie napotka składni, która nie jest obsługiwana przez określony typ w szablonie. Na przykład:
template <class T>
void dosomething(T& x) { x += 5; }
Jeśli T
nie obsługuje +=
operatora, kompilator wygeneruje komunikat o błędzie. A jeśli dzieje się to gdzieś głęboko w bibliotece, komunikat o błędzie może mieć tysiące linii.
Ale szablony C ++ są w zasadzie tylko mechanizmem do pisania kaczego w czasie kompilacji. Błąd szablonu C ++ jest koncepcyjnie bardzo podobny do błędu typu środowiska wykonawczego, który może wystąpić w dynamicznym języku, takim jak Python. Rozważmy na przykład następujący kod Python:
def dosomething(x):
x.foo()
Tutaj, jeśli x
nie ma foo()
metody, interpreter Pythona zgłasza wyjątek i wyświetla ślad stosu wraz z dość wyraźnym komunikatem o błędzie wskazującym problem. Nawet jeśli błąd nie zostanie wyzwolony, dopóki interpreter nie znajdzie się głęboko w jakiejś funkcji bibliotecznej, komunikat o błędzie środowiska wykonawczego nadal nie jest tak zły jak nieczytelne wymioty wyrzucane przez typowy kompilator C ++. Dlaczego więc kompilator C ++ nie może lepiej wyjaśnić, co poszło nie tak? Dlaczego niektóre komunikaty o błędach szablonu C ++ dosłownie powodują przewijanie okna konsoli przez ponad 5 sekund?
clang++
mrugnięcie, mrugnięcie).