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

Sam*_*mal 19 c++ user-defined-literals c++11

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

constexpr double operator "" _kg(double q)
{
   return q*1000;
}
Run Code Online (Sandbox Code Playgroud)

但如果long添加,错误将消失,代码将按如下方式工作:

constexpr double operator "" _kg(long double q)
{
   return q*1000;
}
Run Code Online (Sandbox Code Playgroud)

错误是:

‘constexpr double operator""_kg(double)’ has invalid argument list
Run Code Online (Sandbox Code Playgroud)

这个问题只能由参数和返回类型可以是引起doublelong.

为什么long需要?

Mat*_*Mat 22

C++ 11 draft 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
Run Code Online (Sandbox Code Playgroud)

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