为什么我必须为用户定义的文字使用long double?

时间:2015-05-01 08:36:55

标签: c++ c++11 user-defined-literals

以下用户定义的文字省略了错误:

constexpr double operator "" _kg(double q)
{
   return q*1000;
}

但如果添加了long,则错误将消失,代码将按以下方式运行:

constexpr double operator "" _kg(long double q)
{
   return q*1000;
}

错误是:

‘constexpr double operator""_kg(double)’ has invalid argument list

问题只是由参数引起,返回类型可以是double而不是long

为什么需要long

3 个答案:

答案 0 :(得分:22)

C ++ 11 draft n3290有关于用户定义的文字可以采用的参数(第13.5.8节):

  

文字运算符的声明应具有等效于以下之一的 parameter-declaration-clause

const char*
unsigned long long int
long double
char
wchar_t
char16_t
char32_t
const char*, std::size_t
const wchar_t*, std::size_t
const char16_t*, std::size_t
const char32_t*, std::size_t

如您所见,double不在该列表中,只有long double。因此,您必须将其用于期望浮点数作为参数的用户定义的文字。

答案 1 :(得分:3)

  

文字运算符只允许使用以下参数列表:

     
      
  • (const char *)(1)
  •   
  • (unsigned long long int)(2)
  •   
  • (长双)(3)
  •   
  • (char)(4)
  •   
  • (wchar_t)(5)
  •   
  • (char16_t)(6)
  •   
  • (char32_t)(7)
  •   
  • (const char *,std :: size_t)(8)
  •   
  • (const wchar_t *,std :: size_t)(9)
  •   
  • (const char16_t *,std :: size_t)(10)(const char32_t *,std :: size_t)(11)

         
        
    1. 具有此参数列表的文字运算符是原始文字运算符,用作整数和浮点的回退   用户定义的文字(见上文)

    2.   
    3. 具有这些参数列表的文字运算符是用户定义的整数文字的首选文字运算符

    4.   
    5. 具有这些参数列表的文字运算符是用户定义的浮点文字的首选文字运算符

    6.   
  •   
     

4-7。具有这些参数列表的文字运算符由

调用      

用户定义的字符文字

     

8-11。具有这些参数列表的文字运算符被调用   用户定义的字符串文字

     

不允许使用默认参数不允许使用C语言链接   除了上面的限制,文字运算符和文字   操作员模板是正常的功能(和功能模板),它们   可以声明内联或constexpr,它们可能有内部或   外部链接,它们可以被明确调用,它们的地址可以   等等。

来自cpp参考: http://en.cppreference.com/w/cpp/language/user_literal

答案 2 :(得分:0)

Stroustrup在字符串文字中有一个很好的部分(他从规范中说明):

  • 浮点字面值:由文字运算符接受单个 long double 或const char *参数。

http://www.stroustrup.com/C++11FAQ.html#UD-literals