Страницы

Поиск по вопросам

воскресенье, 1 декабря 2019 г.

Что за оператор такой “” (двойные кавычки)?

#cpp


В общем вопрос в заголовке, что за перегружаемый(если уместно применить к этому слово
перегружаемый) оператор "" и зачем он используется?

long double operator "" _w(long double);
std::stringoperator "" _w (const char16_t* , std::size_t) ;
unsigned operator "" _w(const char*);
int main {
1.2_w; // вызов operator " " _w (1.2L)
u"one"_w; // вызов operator "" _w (u"one", 3)
12_w; // вызов operator " " _w ("12")
"two"_w; // ошибка: нет применимой литеральной операции
}

    


Ответы

Ответ 1



Приведу пример, для чего это может быть использовано: constexpr unsigned long long operator"" _kb ( unsigned long long _bytes) { return _bytes * 1024; } constexpr unsigned long long operator"" _mb ( unsigned long long _bytes) { return _bytes * 1024_kb; } Данные операторы позволяют затем в коде использовать конструкции вида: int64_t buffer = 50_mb; Что по факту будет преобразовано в int64_t buffer = 52428800; Но, на мой взгляд, запись 50_mb сама за себя говорит что это за число. Так же такой механизм удобно использовать для обозначения времени: constexpr unsigned long long operator"" _sec ( unsigned long long _sec) { return _sec * 1000; } constexpr unsigned long long operator"" _min ( unsigned long long _min) { return _min * 60_sec; } И далее использовать как: int delay = 15_min;

Ответ 2



Это пользовательские литералы. Подробнее можно почитать по запросу в гугле, или, например, на хабре . Также стоит почитать здесь .

Ответ 3



#include #include int main() { using namespace std::chrono_literals; //3s - пользовательский литерал, определённый в std::chrono_literals std::chrono::milliseconds interval = 3s; /// выведет 3000 - 3000 миллисекунд std::cout << interval.count() << std::endl; ///А ещё есть префиксный строковый литерал, вопринимающий символы как есть ///Выведет \n\n std::cout << R"(\n\n)" << std::endl; return 0; } Пользовательские литералы, которые Вы сами определяете, необходимо отделять символом подчёркивания, чтобы они не конфликтовали с литералами, входящими в стандартную библиотеку - как 3s из std::chrono_literals в примере

Комментариев нет:

Отправить комментарий