Где определен стандартный библиотечный литерал m, определяемый пользователем?

Я наткнулся на следующий пример, просматривая Основные рекомендации C++ документ:

Пример

change_speed(double s);   // bad: what does s signify?
// ...
change_speed(2.3);

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

change_speed(Speed s);    // better: the meaning of s is specified
// ...
change_speed(2.3);        // error: no unit
change_speed(23m / 10s);  // meters per second

Мы могли бы принять простое (безразмерное) значение double в качестве дельты, но это было бы подвержено ошибкам.

Что касается этой последней строки кода, то на этой конкретной странице не было упоминания о том, что означает этот синтаксис, и он выглядел совершенно чуждым для меня.

После нескольких часов, потраченных впустую, потраченных на выяснение того, что это, вероятно, стандартная библиотека, предопределенный литерал «определяемый пользователем», и узнать о них больше, я попытался выяснить, где определен этот конкретный литерал, но в то время как 's' упоминается здесь вместе с несколькими другими литералами, я не нашел информация о «м».

На SO также есть этот вопрос, но я думаю, что ответы там кажутся совершенно устаревшими.

Вопрос. Где находится стандартный пользовательский литерал "m", заданный* в стандартной библиотеке?


* Милая, милая аллитерация.


person Tasos Papastylianou    schedule 20.07.2017    source источник


Ответы (1)


Это не стандартный пользовательский литерал

Список стандартных пользовательских литералов можно найти здесь внизу: http://en.cppreference.com/w/cpp/language/user_literal

И operator""m не входит в их число, так как стандартная библиотека не работает с единицами длины (пока).

person Fatih BAKIR    schedule 20.07.2017
comment
Спасибо Фатих. На самом деле я уже ссылался на эту ссылку в вопросе :) Итак, если 23m не является литералом стандартной библиотеки, что это? Или, если это это определяемый пользователем литерал, а не стандартный библиотечный, почему он разрешен без подчеркивания? - person Tasos Papastylianou; 21.07.2017
comment
Или вы просто говорите, что Бьерн, вероятно, изобрел литерал, которого еще нет в стандартной библиотеке, просто для этого примера? - person Tasos Papastylianou; 21.07.2017
comment
@TasosPapastylianou, ну, Бьярн на самом деле любит придумывать некоторые функциональные возможности, чтобы некоторые примеры были более понятными (например, использование диапазонов в его книге C++ 11/14). Как вы сказали, его нельзя использовать без подчеркивания. Итак, пока мы не получим стандартные единицы длины, этот код плохо сформирован. - person Fatih BAKIR; 21.07.2017