在 constexpr 表达式中使用 this ptr

Using the this ptr in a constexpr expression

提问人:Alex Vergara 提问时间:11/12/2023 更新时间:11/14/2023 访问量:110

问:

我有两种类型,一种用于定义数字(正整数 >= 1),另一种用于定义整数(任何整数值或整数)。Natural

尝试实现 ,如果减法值< 1,我想返回一个 Integer 而不是 Natural。所以这是我的尝试:operator-(const Natural rhs)

[[nodiscard]] constexpr auto Natural::operator-(const Natural& rhs) const noexcept
    -> std::conditional_t<(_number > rhs.number() + 1), Natural, Integer>
{
    if constexpr(_number > rhs.number() + 1)
        return Natural(_number - rhs.number());
    else
        return Integer(static_cast<int>(_number) - static_cast<int>(rhs.number()));
}

但是 Clang-Tidy 告诉我不允许在 constexpr 分支中使用隐式 this ptr,因为该值在编译时是未知的。 这是有道理的,但我不知道如何使用 SFINAE 以外的其他工具解决这种情况,我试图避免这种情况,因为使用更复杂,代码库应该尽可能简单。

那么,有什么方法可以解决这个问题,并能够在编译时丢弃其中一个分支呢?

注意:自然类型只是一个包装器,而不是一个unsigned int

C++ IF-constexpr

评论

4赞 Red.Wave 11/12/2023
C++ 没有提供根据函数参数值确定函数返回类型的特殊方法。返回类型只能依赖于模板参数。
1赞 Swift - Friday Pie 11/12/2023
这是所有编译语言都存在的一个基本问题,它定义了它们处理参数提升和下溢\溢出的方式。
0赞 molbdnilo 11/12/2023
唯一的方法是编写整数和算术的类型级实现。类型不能依赖于任何运行时值。
0赞 YurkoFlisk 11/12/2023
即使基于函数参数的值定义返回类型是可能的(事实并非如此),它也只对(其计算仅在编译时才有可能,并且参数的值在编译时总是已知的)函数有意义,而对函数(可以在运行时和编译时同时调用两者)有意义。constevalconstexpr
0赞 Pepijn Kramer 11/12/2023
您正在将运行时计算值与必须在编译时确定的选择混合在一起。如果您想要任何接近此内容的内容,您可能需要返回一个 .但这不会使代码的其余部分变得更容易。std::variant<Natural,Integer>

答: 暂无答案