22

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

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需要?

4

4 回答 4

23

C++11 草案 n3290 对用户定义的文字可以采用的参数有这样的说法(第 13.5.8 节):

文字运算符的声明应具有等效于以下之一的参数声明子句:

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中。因此,您必须将其用于期望浮点数作为参数的用户定义文字。

于 2015-05-01T08:53:12.457 回答
3

文字运算符仅允许以下参数列表:

  • ( 常量字符 * ) (1)
  • ( unsigned long long int ) (2)
  • (长双) (3)
  • (字符) (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-7。具有这些参数列表的文字运算符由

用户定义的字符文字

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

不允许默认参数 C 语言不允许链接 除了上述限制之外,字面运算符和字面运算符模板是普通函数(和函数模板),它们可以声明为 inline 或 constexpr,它们可能有内部或外部链接,它们可以被显式调用,它们的地址可以被获取,等等。

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

于 2015-05-01T09:20:16.020 回答
0

Stroustrup 有一个关于字符串文字的重要部分,他在其中声明(来自规范):

  • 浮点文字:被采用单个long double或 const char* 参数的文字运算符接受。

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

于 2015-05-01T08:50:13.603 回答
0

尽管 ANSI C 未能定义一种可以干净地处理long double格式不同于 from 的扩展精度类型的变量参数声明形式double导致该类型在许多平台上被有效弃用(不幸的是,恕我直言,因为它是一个很好的type 不仅用于具有 x87 协处理器的系统,而且还用于没有 FPU 的系统),这是具有适当扩展精度类型的系统处理如下语句的唯一合理方法:

long double a = 0.1;

是使 0.1 数字文字的开始寿命long double等于 14,757,395,258,967,641,293/147,573,952,589,676,412,928;将该语句设置a为 7,205,759,403,792,794/72,057,594,037,927,936(大约 0.10000000000000000555,的值(double)0.1)是荒谬的。

可以说,在某些情况下,在向下转换之前具有数字文字的开始生命long double可能会导致它产生与以doubleor开始生命时不同的值float(例如,最接近float9007199791611905.0是 9007200328482816,其中比请求的值高 536870911,但(float)(double)9007199791611905.0产生 9007199254740992,低于它的 536870913。当然,如果想要浮点值 9007200328482816.0f,可能应该使用更接近实际想要的十进制表示。

于 2015-05-01T16:06:23.267 回答