Двухфазный поиск имени для шаблонов C++ - почему?
Почему стандарт C++ определяет двухфазный поиск шаблонов? Нельзя ли отложить поиск не зависимых объявлений и определений до этапа создания экземпляра?
2 ответов
Они могут. Это самый ранний способ реализации шаблонов
работал, и все еще так, как работал компилятор Microsoft. Чувствовалось
(в комитете), что это было слишком подвержено ошибкам; это сделало слишком легким
случайно захватить имя, с созданием экземпляра в одном переводе
единица подбирая локальное имя, а не нужный глобальный символ. (Ля
типичная единица перевода будет состоять из последовательности #include
s,
объявляя имена, которые все должны видеть, а затем реализация
код. В точке создания экземпляра все, что предшествует точке
instantation виден, включая код реализации.)
окончательное решение состояло в том, чтобы классифицировать символы в шаблоне на два
категории: зависимые и не зависимые, и настаивать на том, что
не зависимые символы разрешаются в точке определения
шаблон, чтобы уменьшить риск их случайной привязки к некоторым
символы локальной реализации. В сочетании с требованием указывать
typename
и template
при необходимости для зависимых символов, это
также позволяет анализировать и проверять некоторые ошибки в точке определения
шаблона, а не только при создании экземпляра шаблона.
Это можно рассматривать как применение разделение.
на первом этапе он просто проверяет правильный синтаксис и разрешает не зависимые имена, как объяснено здесь. На втором этапе он делает что-то более специфичное для шаблона, проверяя, допустимы ли вызовы с конкретными типами. Видите эту [ответить] ( двухфазный поиск-требуется объяснение)
кроме того, если это будет сделано только в одном этапе, тогда это должно быть сделано каждый экземпляр. Этот способ делается только один раз.
Если бы это было сделано только в первом экземпляре, то это было бы то же самое, только менее структурированное.