Я написал функцию, вычисляющую 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
в своей функции?