Двухфазный поиск имени для шаблонов C++ - почему?

Почему стандарт C++ определяет двухфазный поиск шаблонов? Нельзя ли отложить поиск не зависимых объявлений и определений до этапа создания экземпляра?

2 ответов


Они могут. Это самый ранний способ реализации шаблонов работал, и все еще так, как работал компилятор Microsoft. Чувствовалось (в комитете), что это было слишком подвержено ошибкам; это сделало слишком легким случайно захватить имя, с созданием экземпляра в одном переводе единица подбирая локальное имя, а не нужный глобальный символ. (Ля типичная единица перевода будет состоять из последовательности #includes, объявляя имена, которые все должны видеть, а затем реализация код. В точке создания экземпляра все, что предшествует точке instantation виден, включая код реализации.)

окончательное решение состояло в том, чтобы классифицировать символы в шаблоне на два категории: зависимые и не зависимые, и настаивать на том, что не зависимые символы разрешаются в точке определения шаблон, чтобы уменьшить риск их случайной привязки к некоторым символы локальной реализации. В сочетании с требованием указывать typename и template при необходимости для зависимых символов, это также позволяет анализировать и проверять некоторые ошибки в точке определения шаблона, а не только при создании экземпляра шаблона.


Это можно рассматривать как применение разделение.

на первом этапе он просто проверяет правильный синтаксис и разрешает не зависимые имена, как объяснено здесь. На втором этапе он делает что-то более специфичное для шаблона, проверяя, допустимы ли вызовы с конкретными типами. Видите эту [ответить] ( двухфазный поиск-требуется объяснение)

кроме того, если это будет сделано только в одном этапе, тогда это должно быть сделано каждый экземпляр. Этот способ делается только один раз.

Если бы это было сделано только в первом экземпляре, то это было бы то же самое, только менее структурированное.