Ответ 1
В настоящее время он определенно выглядит именно так. Ранее [namespace.std] содержалось
Программа может добавить специализацию шаблона для любого стандартного шаблона библиотеки к пространству имен std только в том случае, если объявление зависит от определенного пользователем типа, а специализация соответствует требованиям стандартной библиотеки для исходного шаблона и явно не запрещена.
Хотя текущий проект утверждает
Если это явно запрещено, программа может добавить специализацию шаблона для любого стандартного шаблона класса библиотеки в пространство имен std при условии, что (a) добавленное объявление зависит, по меньшей мере, от одного определенного типа программы и (b) специализация соответствует требованиям стандартной библиотеки для оригинальный шаблон.
акцент мой
И это похоже на бумагу Thou Shott Not Specialized std Function Templates! Вальтер Э. Браун отвечает за это. В нем он подробно объясняет, почему это должно быть изменено, например:
- Herb Sutter: "специализации не участвуют в перегрузке. [...] Если вы хотите настроить шаблон базы функций и хотите, чтобы эта настройка принимала участие в разрешении перегрузки (или, чтобы всегда использоваться в случае точного соответствия), сделайте это простая старая функция, а не специализация. И если вы обеспечиваете перегрузки, избегайте также специализации ".
- Дэвид Абрахамс: "Неправильно использовать специализированную функцию шаблона [потому что] он плохо взаимодействует с перегрузками. [...] Например, если вы специализируетесь на регулярной
std::swap
дляstd::vector<mytype>&
, ваш специализация не будет выбрана по сравнению с стандартным вектором специфическогоswap
, поскольку специализации arent учитываются при разрешении перегрузки ".- Говард Хиннант: "Этот вопрос давно разрешен... Не обращайте внимания на мнение Дэйвса/ответ в этой области на свой страх и риск".
- Эрик Ниблер: "[из-за] решительно неудобный способ C++ разрешает вызовы функций в шаблонах..., [w] e делает неквалифицированный вызов для
swap
, чтобы найти перегрузку, которая может быть определена в [...] связанных с именами [...], и мыusing std::swap
так что, во избежание такой перегрузки, мы находим версию по умолчанию, определенную в пространстве имен std. "- Стандарт кодирования с высокой степенью целостности C++: "Разрешение перегрузки не учитывает явные специализации шаблонов функций. Только после выбора разрешения перегрузки шаблон функции будет рассматривать любые явные специализации".