Шаблони C ++ відомі для створення довгих нечитабельних повідомлень про помилки. Я маю загальне уявлення про те, чому повідомлення про помилки шаблону в C ++ такі погані. По суті, проблема полягає в тому, що помилка не спрацьовує, поки компілятор не зустріне синтаксис, який не підтримується певним типом у шаблоні. Наприклад:
template <class T>
void dosomething(T& x) { x += 5; }
Якщо оператор T
не підтримує +=
, компілятор генерує повідомлення про помилку. І якщо це відбувається десь у бібліотеці, повідомлення про помилку може становити тисячі рядків.
Але шаблони C ++ - це, по суті, лише механізм введення качки під час компіляції. Помилка шаблону C ++ концептуально дуже схожа на помилку типу виконання, яка може виникнути на динамічній мові, як Python. Наприклад, розглянемо наступний код Python:
def dosomething(x):
x.foo()
Тут, якщо x
немає foo()
методу, інтерпретатор Python видає виняток і виводить слід стека разом із досить чітким повідомленням про помилку, що вказує на проблему. Навіть якщо помилка не спрацьовує до тих пір, поки інтерпретатор не заглибиться в якусь функцію бібліотеки, повідомлення про помилку виконання ще не є десь поруч, як нечитабельна блювота, викликана типовим компілятором C ++. То чому не може компілятор C ++ бути більш зрозумілим, що пішло не так? Чому деякі повідомлення про помилки шаблону C ++ буквально змушують прокручувати вікно консолі більше 5 секунд?
clang++
підморгують).