Что такое s
в std::this_thread::sleep_for(2s)
?
s
- это пользовательский литерал , делающий 2s
литеральным значением типа chrono::second
.
Встроенные литералы
Возможно, вы знакомы с целочисленными литералами и плавающими литералами ; это встроенные суффиксы:
+--------+---------+---------------+
| Suffix | Example | Type |
+--------+---------+---------------+
| U | 42U | unsigned int |
| LL | 1LL | long long int |
| f | 3.14f | float |
+--------+---------+---------------+
Они позволяют вам предоставить буквальное значение, тип которого соответствует вашим потребностям. Например:
int half(int n) { return n/2; }
float half(float f) { return f/2; }
half(3); // calls the int version, returns 1 (int)
half(3.f); // calls the float version, returns 1.5f (float)
Пользовательские литералы
C ++ 11 добавил новую функцию: пользовательский литерал суффиксы:
Позволяет использовать целочисленные, с плавающей точкой, символьные и строковые литералы для создания объектов пользовательского типа путем определения пользовательского суффикса.
Синтаксис
Они позволяют предоставлять литерал определенного пользователем типа или типа, определенного стандартной библиотекой. Определить литерал так же просто, как определить operator""
:
// 0_<suffix> is now a <type> literal
<type> operator "" _<suffix>(unsigned long long); // ull: one of the height existing forms
* * Пример тысячи сорок четыре * * 1045
#include <iostream>
class Mass
{
double _value_in_kg;
public:
Mass(long double kg) : _value_in_kg(kg) {}
friend Mass operator+ (Mass const& m1, Mass const& m2) { return m1._value_in_kg + m2._value_in_kg; }
friend std::ostream& operator<<(std::ostream& os, Mass const& m) { return os << m._value_in_kg << " kg"; }
};
Mass operator "" _kg(long double kg) { return Mass{kg}; }
Mass operator "" _lb(long double lb) { return Mass{lb/2.20462}; }
int main()
{
std::cout << 3.0_kg + 8.0_lb << '\n';
}
Вывод «6,62874 кг» (демо) как , следует .
Дело std::chrono
В отличие от «настоящих» пользовательских литералов стандартная библиотека предоставляет литералы, не начинающиеся с подчеркивания (_
). s
является одним из них и определено в <chrono>
(начиная с C ++ 14):
constexpr chrono::seconds operator "" s(unsigned long long secs);
С другими литералами продолжительности, вы можете написать что-то вроде:
#include <chrono>
using namespace std::chrono_literals;
const auto world_marathon_record_2018 = 2h + 1min + 39s;