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

99
14 февраля 2021, 17:10

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

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; // ошибка: нет применимой литеральной операции
}
Answer 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;
Answer 2

Это пользовательские литералы.

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

Также стоит почитать здесь .

Answer 3
#include <iostream>
#include <chrono>

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 в примере

READ ALSO
html, что это значит? и как её заменить?

html, что это значит? и как её заменить?

Есть вот такая запись которая применяется ко всей странице,что тут означает запятая?

84
Позиционирование слоёв в CSS

Позиционирование слоёв в CSS

Прошу помочь, не могу разобраться с позиционированием слоев

99
Проблема при создании футера сайта HTML CSS

Проблема при создании футера сайта HTML CSS

Вроде правильно пишу код, по гайду, а футер выглядит не так как надоИ еще не могу номер телефона по центру сделать (на номер внимания не обращайте,...

95
Вертикальное позиционирование SVG-элемента поверх и под другие элементы

Вертикальное позиционирование SVG-элемента поверх и под другие элементы

Нужно, чтобы элемент rect1 был расположен под rect2, но rect3 (синий) располагался над rect2 (зелёный) и под rect1 (красный)

95