Что такое s в std :: this_thread :: sleep_for (2s)? - PullRequest
0 голосов
/ 15 ноября 2018

Я считаю, что std :: this_thread :: sleep_for может обрабатывать единицу времени с.

std::this_thread::sleep_for(2s);

Но я не знаю, что такое s в 2sесть.

Ответы [ 3 ]

0 голосов
/ 15 ноября 2018

Что такое 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;
0 голосов
/ 15 ноября 2018

s в этом выражении на самом деле является библиотечной функцией хронографа, определенной в стандартной библиотеке

0 голосов
/ 15 ноября 2018

"s" обозначает второй и фактически буквальный оператор, определенный в стандартной библиотеке. Литералы являются частью стандарта C ++ 14. Вы можете получить к ним доступ по using namespace std::chrono_literals;

...