用户定义字面量

用戶定義字面量（user-defined literal）是C++程序設計語言從C++11標準開始支持的用戶定義類型的字面量。

背景

傳統的C/C++提供了多種字面量。例如，「12.5」是一個字面量，被編譯器當作double類型且值為12.5。如果增加後綴「f」，則「12.5f」就是float類型且值為12.5。字面量的後綴是由C/C++標準規定的，程序不能增加新的字面量類型或其後綴。
C++11增加了用戶自行定義新的字面量後綴並由此用字面量構造對象的能力。這是通過定義字面量運算符（literal operator）函數或函數模板實現。該運算符名字由一對相鄰雙引號前導。字面量運算符通常在用戶定義字面量的地方被隱式調用。例如，
#include<iostream>struct S{
    int value;};S operator ""_mysuffix(unsigned long long v)  //用户定义字面量运算符的实现{
     S s_;
     s_.value=(int)v;
     return s_;}int main(){
   S sv;
   sv=101_mysuffix;  //这里的101是类型S的字面量
   std::cout<<sv.value<<std::endl;
   return 0;}

原始形式字面量

用戶定義字面量的原始形式示例如下：
OutputType operator "" _suffix(const char * literal_string); //声明用户定义字面量的处理函数OutputType some_variable = 1234_suffix; //使用用户定义字面量
原始字面量運算符（raw literal operator）只能有單個參數，參數類型為const char * 。
處理整型或浮點型的用戶定義原始形式字面量可以選擇使用可變參數模板：
template<char...> OutputType operator "" _tuffix(); //声明函数模板OutputType some_variable = 1234_tuffix;   //使用OutputType another_variable = 2.17_tuffix;//使用
字面量運算符模板（literal operator template）的函數形參表必須為空；模板形參表只能有一個成員，即非類型的模板參數包（non-type template paremeter pack），其成員類型為char。
例如，上例中的字面量處理運算符函數模板被實例化為operator "" _tuffix<'1', '2', '3', '4'>()。這種情形下，沒有字符串終止的null字符。這種形式的目的是使用C++11新增加的constexpr關鍵字，允許字面量在編譯期被正確處理，這必須滿足OutputType類型是常量表達式可構造（constexpr-constructable）與可複製（copyable）的，且字面量運算符函數（模板）是constexpr的。
例如：
#include<iostream>#include<string>using namespace std;struct S{
    S (const char * lls): value(lls){};
    string value;};template < char ... cdots> S operator "" _mysuffix(){
    const char cv[] {cdots...,'\0'}; //把可变的模板参数用于初始化器（initializer）
    S  sv_(cv);
    return sv_;}int main(){
   S sv {1234.567_mysuffix} ;
   std::cout<<sv.value<<std::endl;
   return 0;}

加工後形式的用戶定義字面量

加工後形式的數值字面量所採用的類型，對於整型字面量是unsigned long long，對於浮點型字面量是long double。
不需要有符號的整型，因為整型字面量的符號前綴被分析（parse）為一個包含了作為酉前綴運算符（unary prefix operator）的表達式。
例如：
OutputType operator "" _suffix(unsigned long long);OutputType operator "" _suffix(long double);OutputType some_variable = 1234_suffix; // Uses the 'unsigned long long' overload.OutputType another_variable = 3.1416_suffix; // Uses the 'long double' overload.

字符串字面量

對於字符串字面量，可使用下述形式，並可配合C++11的幾種字符串前綴：
OutputType operator "" _ssuffix(const char     * string_values, size_t num_chars);OutputType operator "" _ssuffix(const wchar_t  * string_values, size_t num_chars);OutputType operator "" _ssuffix(const char16_t * string_values, size_t num_chars);OutputType operator "" _ssuffix(const char32_t * string_values, size_t num_chars);OutputType some_variable =   "1234"_ssuffix; // Uses the 'const char *' overload.OutputType some_variable = u8"1234"_ssuffix; // Uses the 'const char *' overload.OutputType some_variable =  L"1234"_ssuffix; // Uses the 'const wchar_t *'  overload.OutputType some_variable =  u"1234"_ssuffix; // Uses the 'const char16_t *' overload.OutputType some_variable =  U"1234"_ssuffix; // Uses the 'const char32_t *' overload.
上述字符串字面量運算符函數的第二個參數表示字符串不包括尾null字符的長度。字符串字面量沒有可選的模板函數實現。

字符字面量

字符字面量可類似於字符串字面量那樣定義與使用。 例如：
#include<iostream>#include<string>using namespace std;struct S{
    S (const char * lls): value(lls){};
    string value;};S operator "" _mysuffix(const char     * string_values, size_t num_chars) //字符串字面量{
    S  sv_ (string_values);
    return sv_;}S operator "" _mysuffix(char value) //字符字面量{
   const char cv[] {value,'\0'};
   S  sv_ (cv);
   return sv_;}int main(){
   S sv {"hello"_mysuffix} ;
   std::cout<<sv.value<<std::endl;
   S cv  {'h'_mysuffix} ;
   std::cout<<cv.value<<std::endl;
   return 0;}