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