gpt4 book ai didi

c++ - 为什么 for-loop 不是编译时表达式并且扩展的 constexpr 允许在 constexpr 函数中进行循环

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:56:05 26 4
gpt4 key购买 nike

我是这样写代码的

#include <iostream>
using namespace std;
constexpr int getsum(int to){
int s = 0;
for(int i = 0; i < to; i++){
s += i;
}
return s;
}
int main() {
constexpr int s = getsum(10);
cout << s << endl;
return 0;
}

我知道它之所以有效是因为 extended constexpr .然而在这个问题why-isnt-a-for-loop-a-compile-time-expression ,作者给出了他的代码如下:

#include <iostream>
#include <tuple>
#include <utility>

constexpr auto multiple_return_values()
{
return std::make_tuple(3, 3.14, "pi");
}

template <typename T>
constexpr void foo(T t)
{
for (auto i = 0u; i < std::tuple_size<T>::value; ++i)
{
std::get<i>(t);
}
}

int main()
{
constexpr auto ret = multiple_return_values();
foo(ret);
}

它不能通过GCC5.1 编译,但是在替换std::get<i>(t); 之后对于没有指定模板参数的东西,他的代码确实有效。在阅读了这个问题下的答案后,我发现他们的主要观点是 constexpr for给编译器带来麻烦,因此在运行时使用 for-loop。所以这让我感到困惑,一方面,for-loop在运行时,另一方面,循环在 constexpr 中函数,所以它必须在编译时计算,所以似乎有矛盾。我只是想知道我在哪里犯了错误。

最佳答案

您的函数需要在运行时和编译时都有效。所以你的 Variant i 可以看作是一个运行时变量。如果函数在编译时执行,则变量 i 是编译器运行时的一部分。因此,constexpr 函数中的 int 与非 constexpr 函数中的 int 遵循相同的规则。

你可以做的是创建你自己的 constexpr for 循环:

template<typename F, std::size_t... S>
constexpr void static_for(F&& function, std::index_sequence<S...>) {
int unpack[] = {0,
void(function(std::integral_constant<std::size_t, S>{})), 0)...
};

(void) unpack;
}

template<std::size_t iterations, typename F>
constexpr void static_for(F&& function) {
static_for(std::forward<F>(function), std::make_index_sequence<iterations>());
}

然后,您可以像这样使用您的 static_for:

static_for<std::tuple_size<T>::value>([&](auto index) {
std::get<index>(t);
});

请注意,在 C++17 之前,lambda 函数不能用在 constexpr 函数中,因此您可以改为使用自己的仿函数:

template<typename T>
struct Iteration {
T& tuple;

constexpr Iteration(T& t) : tuple{t} {}

template<typename I>
constexpr void operator() (I index) const {
std::get<index>(tuple);
}
};

现在您可以像这样使用 static_for:

static_for<std::tuple_size<T>::value>(Iteration{t});

关于c++ - 为什么 for-loop 不是编译时表达式并且扩展的 constexpr 允许在 constexpr 函数中进行循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42005229/

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