我正在尝试使用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;
}
答案 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
此处未列出double
或double&
,const long double&
:所以不允许这样做。