Back to TIL list

C++ Literais definidas pelo usuário

Created at

Para que servem

  • para definir atalhos sintáticos para linguagens comuns e aumentar a segurança do tipo
  • para conveniência ou para dedução de tipo em tempo de compilação

Desempenho

  • não há vantagem ou desvantagem de desempenho para literais definidos pelo usuário

Categorias de literais

Existem 6 categorias:

  • inteiro
  • caractere
  • ponto flutuante
  • cadeia de caracteres
  • bool
  • ponteiro

Literais definicos na biblioteca padrão

<string>

string str = "hello"s + " world"s;

<complex>

complex<double> num = (2.0 + 3.01i) * (5.0 + 4.3i);

<chrono>

bash
auto duration = 15ms + 42h;

Assinaturas dos literais definidos pelo usuário

Você implementa um literal definido pelo usuário definindo um operator "" no escopo de namespace com uma das seguintes assinaturas:

ReturnType operator "" _a(unsigned long long int);   // Literal operator for user-defined INTEGRAL literal
ReturnType operator "" _b(long double);              // Literal operator for user-defined FLOATING literal
ReturnType operator "" _c(char);                     // Literal operator for user-defined CHARACTER literal
ReturnType operator "" _d(wchar_t);                  // Literal operator for user-defined CHARACTER literal
ReturnType operator "" _e(char16_t);                 // Literal operator for user-defined CHARACTER literal
ReturnType operator "" _f(char32_t);                 // Literal operator for user-defined CHARACTER literal
ReturnType operator "" _g(const char*, size_t);      // Literal operator for user-defined STRING literal
ReturnType operator "" _h(const wchar_t*, size_t);   // Literal operator for user-defined STRING literal
ReturnType operator "" _i(const char16_t*, size_t);  // Literal operator for user-defined STRING literal
ReturnType operator "" _g(const char32_t*, size_t);  // Literal operator for user-defined STRING literal
ReturnType operator "" _r(const char*);              // Raw literal operator
template<char...> ReturnType operator "" _t();       // Literal operator template

Referências