Фон
В С++ 03 символы, используемые в качестве аргументов шаблона, должны иметь внешнюю связь; это ограничение было удалено в С++ 11, как описано в предыдущем вопросе:
В С++ 03 аргументы шаблона не могут иметь внутренней связи:
[C++03: 14.6.4.2/1]:
Для вызова функции, который зависит от параметра шаблона, если имя функции является неквалифицированным идентификатором, но не идентификатором шаблона, функции-кандидаты обнаруживаются с использованием обычных правил поиска (3.4.1, 3.4. 2), за исключением того, что:
- Для части поиска, использующей поиск неквалифицированного имени (3.4.1), найдены только объявления функций с внешней привязкой из контекста определения шаблона.
- Для части поиска с использованием связанных пространств имен (3.4.2) найдены только объявления функций с внешней связью, найденные либо в контексте определения шаблона, либо в контексте создания шаблона.
[..]
Это было изменено (вопрос # 561: "Внутренние функции привязки в зависимом поиске имен" ) в С++ 11:
[C++11: C.2.6]:
14.6.4.2
Изменить: разрешить зависимые вызовы функций с внутренней связью
Обоснование: Слишком ограниченные, упрощают правила разрешения перегрузки.в результате:
[C++11: 14.6.4.2/1]:
Для вызова функции, зависящего от параметра шаблона, функции-кандидата найдены с использованием обычных правил поиска (3.4.1, 3.4.2, 3.4.3), за исключением того, что:
- Для части поиска, использующей поиск неквалифицированного имени (3.4.1) или поиск квалифицированного имени (3.4.3), отображаются только объявления функций из контекста определения шаблона.
- Для части поиска с использованием связанных пространств имен (3.4.2) найдены только объявления функций, найденные в контексте определения шаблона или контекста создания шаблона.
[..]
(Определите недостающую "внешнюю привязку" ).
Проблема № 561 ( "Функции внутренней привязки в зависимом поиске имен" ), предложение, которое привело к тому, что ограничение было удалено в C + +11, спрашивает:
Кроме того, действительно ли необходимо исключить внутренние функции привязки из поиска? Разве ODR не дает реализаций достаточной широты для обработки этого случая без другой морщины при поиске имени?
С более поздним ответом:
Консенсус группы заключался в том, что [..] функции внутренней связи должны быть найдены путем поиска (хотя они могут приводить к ошибкам, если они выбраны с помощью разрешения перегрузки).
Вопрос
Каково было первоначальное практическое обоснование ограничения?
Похоже, что, должно быть, один из них, поскольку оригинальная стандартная формулировка пошла по пути, чтобы ограничить поиск символами внешней связью.
Это только то, что "[функции внутренней связи] могут приводить к ошибкам, если они выбраны с помощью разрешения перегрузки", и что в 2000-м мнении изменилось, насколько это важно? Или что-то изменилось, возможно, как косвенное следствие новой формулировки в другом месте для другой функции С++ 11?