Подтвердить что ты не робот

Поиск по двум фазам для шаблонов С++ - Почему?

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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