自定义文字使用long double但不是double,并且传递值但不通过引用传递

时间:2014-07-25 13:30:45

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

我正在尝试使用C ++自定义文字。我发现奇怪的是,当我将类型从long double类型更改为double或尝试通过引用传递时,下面的简单函数停止工作。

起初我认为它与constexpr的使用有关,但似乎并非如此,因为如果它们不在operator ""上,这两种方法都可以正常工作,并从constexpr中移除operator ""不会删除错误。

这些经过深思熟虑的决定是在语言设计中,还是只是我的编译器(gcc 4.8.2)无法处理的细微差别?

// Conversion function, works fine with both long double and
// double, and with or without pass by reference.
constexpr long double to_deg (const long double& deg)
{
    return deg*M_PI/180.0;
}

// Custom literal with long double types and pass by value,
// works fine.
constexpr long double operator "" _deg (long double deg)
{
    return deg*M_PI/180.0;
}

// Custom literal with double types, gives "Invalid argument list."
// error.
constexpr double operator "" _deg (double deg)
{
    return deg*M_PI/180.0;
}

// Custom literal with pass by reference, gives "Invalid argument list." 
// error. Removing the const does not remove the error.
constexpr long double operator "" _deg (const long double& deg)
{
    return deg*M_PI/180.0;
}

1 个答案:

答案 0 :(得分:5)

C ++标准,第13.5.8节(用户定义的文字),列出了所有有效类型:

  

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

     
      
  • const char *
  •   
  • unsigned long long int
  •   
  • long double
  •   
  •   
  • 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
  •   

此处未列出doubledouble&const long double&:所以不允许这样做。