为什么在此constexpr函数中允许std :: swap?

时间:2019-03-11 09:49:34

标签: c++ c++17

我编写了一个计算两个数字的gcd的函数,该函数在第二个参数大于第一个参数的情况下使用std::swap

一段时间后,我意识到std::swap不是不是 constexpr,但是我的函数仍然可以编译并成功运行。
我尝试使用MinGW-w64 8.1.0和Visual C ++ 2017,并且对两者都有效。

我的第一个想法是,因为允许constexpr函数在运行时执行,所以我尝试了std::integral_constant<int,gcd(32,12)>,它起作用了。

但是,我不能使用自己的任何非constexpr函数(这是我所期望的)。

这是我的测试代码:

#include <utility>

inline void foo() noexcept {
}

template<typename T>
constexpr T gcd(T a, T b) {
    // foo();            // only works with non-constexpr j
    if(a<b) {
        std::swap(a, b); // works for both constexpr i and non-constexpr j
    }
    if(b==0) {
        return a;
    } else {
        return gcd(b, a%b);
    }
}

int main()
{
    constexpr int i = std::integral_constant<int, gcd(32, 12)>::value;
    int j = gcd(32,12);
}

所以,我的问题是:为什么我可以在函数中使用std::swap

0 个答案:

没有答案