Ответ 1
То, как работают литералы с плавающей точкой!!
Добавьте пару круглых скобок и он должен работать:
std::cout << (4_s).count();
Или, наоборот, отделите их (чтобы остановить компилятор от интерпретации его как плохо сформированного дробного постоянного литерала с плавающей запятой):
std::cout << 4_s .count();
// ^ Space here!
Ссылка: CppReference.com
В разделе Примечания ссылки выше,
Из-за максимального munch, определяемых пользователем целых чисел и чисел с плавающей запятой, заканчивающихся на [
p
,p
, (начиная с С++ 17)]e
иe
, за которыми следуют операторы+
или-
, должен быть отделен от оператора пробелом в источнике:long double operator""_E(long double); long double operator""_a(long double); int operator""_p(unsigned long long); auto x = 1.0_E+2.0; // error auto y = 1.0_a+2.0; // OK auto z = 1.0_E +2.0; // OK auto w = 1_p+2; // error auto u = 1_p +2; // OK
Итак, когда дело доходит до точки, которая используется как десятичная точка, она должна быть отделена от чего-либо позади или будет рассматриваться как часть числа с плавающей запятой strong > .
Я тестировал пример выше из CppReference и получил сообщение о силимаре с очень сильным выражением:
test.cpp:19:10: error: unable to find numeric literal
operator 'operator""_E+2.0'
^^^^^^
auto x = 1.0_E+2.0; // error
Получается, как _E+2.0
рассматривается как целое ud-суффикс?
Мое первоначальное объяснение можно найти в истории изменений этого сообщения.