Прецедент для идентификаторов вида _<number>
является механизмом объекта-заполнителя аргумента функции в std::placeholders
(§20.8.9.1.3), который определяет число таких символов, определяемое реализацией.
Это хорошая вещь, потому что это означает, что пользователь не может #define
любой идентификатор этой формы.§17.6.4.3.1 / 1:
Блок перевода, который включает стандартный заголовок библиотеки, не должен имен #define или #undef, объявленных в любом заголовке стандартной библиотеки.
Имя пользовательской литеральной функции - operator "" _123
, а не просто _123
, поэтому нет прямого конфликта между вашим именем и именем библиотеки, если присутствует using namespace std::placeholders;
.
My 2¢ тем не менее, вам лучше использовать operator "" _baseconv
и кодировать базу в литерале, "123123_4"_baseconv
.
Редактировать: Глядя на Иоганнеса '(удалено) ответ, есть Может возникнуть опасение, что реализация может быть использована как макрос в качестве макроса *1026*.Это, безусловно, область теории, так как при таком использовании препроцессора реализация вряд ли выиграет.Кроме того, если я не ошибаюсь, причина скрытия этих символов в std::placeholders
, а не std
, заключается в том, что такие имена больше могут использоваться пользователем, например, путем включенияBoost Bind (который не скрывает их в именованном пространстве имен).
Токены не зарезервированы для использования реализацией глобально (17.6.4.3.2), и существует прецедентдля их использования, поэтому они по крайней мере так же безопасны, как, скажем, forward
.