Pull to refresh

Comments 5

Да-да, специализации шаблонов функций в нём тоже отметили как приводящие к неопределённому поведению (см. C++20 final working draft, п. 16.5.4.2.1).

А можно это утверждение как-то аргументировать более развернуто? Поскольку в стандарте сказано:


Unless explicitly prohibited, a program may add a template specialization for any standard library class template to namespace std provided that (a) the added declaration depends on at least one program-defined type and (b) the specialization meets the standard library requirements for the original template.

The behavior of a C++ program is undefined if it declares an explicit or partial specialization of any standard library variable template, except where explicitly permitted by the specification of that variable template.

Т.е. можно вводить специализации для типов, которые определены в программе (если эти специализации удовлетворяют стандарту), но нельзя делать специализации для template variables. Плюс там же ряд ограничений на частичные/полные специализации методов стандартных классов.

А можно это утверждение как-то аргументировать более развернуто?

Конечно, можно. Для начала рассмотрим цитату из стандарта C++17, п 20.5.4.2.1:


The behavior of a C++ program is undefined if it adds declarations or definitions to namespace std or to a namespace within namespace std unless otherwise specified. A program may add a template specialization for any standard library template to namespace std only if the declaration depends on a user-defined type and the specialization meets the standard library requirements for the original template and is not explicitly prohibited.

То есть, можно добавлять специализацию для любого шаблона из стандартной библиотеки, если специализация добавляется для кастомного типа (и удовлетворяет остальным ограничениям стандарта).


Теперь рассмотрим аналогичную выдержку из драфта стандарта C++20, п 16.5.4.2.1:


Unless explicitly prohibited, a program may add a template specialization for any standard library class template to namespace std provided that (a) the added declaration depends on at least one program-defined type and (b) the specialization meets the standard library requirements for the original template.

То есть, раньше была формулировка "специализация любого шаблона из стандартной библиотеки", а теперь — "специализация любого шаблона класса из стандартной библиотеки". Следовательно, специализации шаблонов функций исключили из списка того, что можно добавить в namespace std.

Более того, внутри библиотечных функций не нужно дописывать никаких «using»: поскольку их код и так находится внутри std, компилятор всё равно будет выбирать правильную перегрузку.

Насколько я понял, правильная перегрузка с точки зрения автора кода как раз из util, чтобы не было «a bunch of copy operations». Разве компилятор её выберет?

Да, согласно ADL он её и выберет.

Sign up to leave a comment.