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

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

2 ответа

Решение

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

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

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

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

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

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

Другие вопросы по тегам