gpt4 book ai didi

c++ - 用户定义的文字参数不是 constexpr?

转载 作者:IT老高 更新时间:2023-10-28 21:36:03 25 4
gpt4 key购买 nike

我正在测试用户定义的文字。我想让 _fac 返回数字的阶乘。

让它调用 constexpr 函数可以工作,但是它不允许我使用模板来执行此操作,因为编译器会提示参数不是也不能是 constexpr

我对此感到困惑 - 文字不是常量表达式吗? 5_fac 中的 5 始终是可以在编译时评估的文字,那为什么我不能这样使用它呢?

第一种方法:

constexpr int factorial_function(int x) {
return (x > 0) ? x * factorial_function(x - 1) : 1;
}

constexpr int operator "" _fac(unsigned long long x) {
return factorial_function(x); // this works
}

第二种方法:

template <int N> struct factorial_template {
static const unsigned int value = N * factorial_template<N - 1>::value;
};
template <> struct factorial_template<0> {
static const unsigned int value = 1;
};

constexpr int operator "" _fac(unsigned long long x) {
return factorial_template<x>::value; // doesn't work - x is not a constexpr
}

最佳答案

我不知道在 C++11 中是否有比当前接受的答案更好的方法来做到这一点,但是在 C++14 中使用宽松的 constexpr,你可以只写“正常"代码:

constexpr unsigned long long int operator "" _fac(unsigned long long int x) {
unsigned long long int result = 1;
for (; x >= 2; --x) {
result *= x;
}
return result;
}

static_assert(5_fac == 120, "!");

关于c++ - 用户定义的文字参数不是 constexpr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8108473/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com