是否允许为自定义数字类型专门化数学常量?

Is it permissible to specialize mathematical constants for custom numeric types?

假设我创建自己的浮点类型 MyFloatingPoint(例如,相对于 built-in 类型提供更高的精度)。是否允许在 C++20 <numbers> header 中为此类型专门化常量,或者这是未定义的行为?

是的,但前提是特化依赖于程序定义的类型(而不是仅内置/标准库类型)。

参见 C++ 标准的 post-C++20 草案中的 [math.constants]/2

请注意,如果标准中没有这样的特定许可,通常不允许特化标准库变量模板。参见 [namespace.std]/3

根据 C++20 draft 看起来不错:

26.9.2 (...) 2. Pursuant to 16.5.4.2.1, a program may partially or explicitly specialize a mathematical constant variable template provided that the specialization depends on a program-defined type

不,这不是未定义的行为(使用该术语时要小心)。 我没有看到任何大问题(特别是在阅读其他评论之后)。

#include <numbers>

struct my_floatingpoint_t
{
    double value;
};

namespace std
{
    namespace numbers
    {
        template<>
        constexpr my_floatingpoint_t pi_v<my_floatingpoint_t>{3.14};
    }
}


int main()
{
    auto pi = std::numbers::pi_v<double>;
    auto my_pi = std::numbers::pi_v<my_floatingpoint_t>;
    return 0;
}