В C++ 11 и более поздних версиях разрешено специализировать std :: to_string в пространстве имен std для пользовательских типов?
Нет. Прежде всего, it is not a template function, поэтому вы не можете специализироваться на нем.
Если вы спрашиваете о добавлении собственных функций перегрузки, ответ остается неизменным.
Документация отрывок из Extending the namespace std:
Это неопределенное поведение, чтобы добавить декларации или определения патезрася или любое пространству имен, вложенные в станде, с несколькими исключениями, указанных ниже
Разрешается добавлять специализированные шаблоны для любого стандартного шаблона библиотеки для пространства имен std, только если объявление зависит от пользовательского типа, и специализация удовлетворяет всем требованиям для исходного шаблона, за исключением случаев, когда такие специализации запрещены.
На практике все будет, вероятно, прекрасно работают, но, строго говоря, стандарт говорит, что нет никакой гарантии того, что будет происходить.
Edit: У меня нет доступа к официальному стандарту, так что следующее из free working draft (N4296) в:
17.6.4.2 использования пространств имен
17.6.4.2.1 Пространство имён std
- Поведение Программа C++ не определена, если она добавляет объявления или определения в пространство имен std или в пространство имен в пространстве имен std, если не указано иное. Программа может добавить специализацию по шаблону для любого стандартного шаблона библиотеки в пространство имен std только в том случае, если объявление зависит от определенного пользователем типа , а специализация соответствует стандартным требованиям библиотеки для исходного шаблона и явно не указывается .
Поведение программы ++ в C не определен, если он объявляет
2,1 - явная специализация любой функции члена стандартного шаблона класса библиотеки или
2,2 - явная специализация любого шаблон функции-члена стандартного класса библиотеки или шаблона класса, или
2.3 - явная или частичная специализация любого шаблона класса классов стандартного класса библиотеки или класса .
Программа может явно экземпляр шаблона, определенный в стандартной библиотеке, только если декларация зависит от имени определяемого пользователем типа и конкретизация соответствует стандартным требованиям библиотеки для исходного шаблона.
- Единица перевода не должна объявлять пространство имен std внутренним пространством имен (7.3.1).
Без гарантии .. Не определено? Я не могу поверить, что это неопределенное поведение. Специализация для любого другого пространства имен работает просто отлично. Я очень сомневаюсь, что будут какие-либо последствия с точки зрения поведения программы. Я думаю, что стандарт должен просто сказать, что это запрещено и не называть его неопределенным, если это действительно так. Как это может привести к неопределенному поведению? – Brandon
@Brandon: Обычно мы ожидаем, что компиляторы будут ошибочны, когда мы будем запрещать вещание, но требовать от компиляторов обнаружить и диагностировать подобные вещи нереально. Следовательно, UB. –
Это печально. Хотелось бы, чтобы они сделали исключение для 'std :: to_string'. Или в качестве альтернативы, предоставить некоторые другие средства для ее специализации, например. используя что-то вроде 'template auto f (T && t) -> std :: enable_if_t > :: value, void> {ToStringSpec >() (std :: forward (t)); } ' –
jotik