Я узнаю о пользовательских литералах и запутался со следующим тестовым кодом:
std::chrono::seconds operator"" _s(unsigned long long s) {
return std::chrono::seconds(s);
}
std::string operator"" _str(const char *s, std::size_t len) {
return std::string(s, len);
}
int main() {
auto str = "xxxxx"_str;
std::cout << str.size() << std::endl; // works
auto sec = 4_s;
std::cout << sec.count() << std::endl; // works
std::cout << "xxxxx"_str.size() << std::endl; // works
std::cout << 4_s.count() << std::endl; // does **NOT** work!
return 0;
}
Компилятор выдает следующее сообщение об ошибке:
error: нет соответствующего литерал-оператора для вызова "operator" "_s.count" с аргументом типа "unsigned long long" или "const char *" и без соответствующего шаблона оператора литерала
cout < 4_s.count() < епсИ;
Кажется, что он принимает _s.count как пользовательский литерал. Кроме того, литерал с плавающей запятой ведет себя как целочисленный литерал.
Почему пользовательские целые литералы и строковые литералы имеют другое поведение?