constexpr in for-Statement

Jon*_*Mee 5 c++ for-loop template-meta-programming c++17 if-constexpr

提供if constexpr,其中:

condition的值必须是类型的上下文转换的常量表达式bool.如果值为true,则丢弃statement-false(如果存在),否则,将丢弃statement-true

有没有办法在a- forstatement中使用它?要在编译时展开循环吗?我希望能够做到这样的事情:

template <int T>
void foo() {
   for constexpr (auto i = 0; i < T; ++i) cout << i << endl;
}
Run Code Online (Sandbox Code Playgroud)

max*_*x66 7

有没有办法在for语句中使用它?要在编译时展开循环吗?我希望能够做这样的事情

我不这么认为.

但是如果你能负担一个辅助函数,用std::integer_sequence一个未使用的C风格的整数数组初始化,从C++ 14开始你可以做如下的事情

#include <utility>
#include <iostream>

template <int ... Is>
void foo_helper (std::integer_sequence<int, Is...> const &)
 {
   using unused = int[];

   (void)unused { 0, (std::cout << Is << std::endl, 0)... };
 }

template <int T>
void foo ()
 { foo_helper(std::make_integer_sequence<int, T>{}); }

int main ()
 {
   foo<42>();
 }
Run Code Online (Sandbox Code Playgroud)

如果你可以使用C++ 17,你可以避免unused使用折叠,使用折叠foo_helper()可以简单地编写如下

template <int ... Is>
void foo_helper (std::integer_sequence<int, Is...> const &)
 { ((std::cout << Is << std::endl), ...); }
Run Code Online (Sandbox Code Playgroud)


Ser*_*eyA 5

如果编译器知道循环限制,则编译器将展开循环(如果发现有好处)。并非所有循环展开都是有益的!关于循环展开的好处,您不可能做出比编译器更好的决策。

不需要constexpr for(如您所说),因为constexpr if启用了功能-您可能会将会使程序constexpr if错误格式的代码放在false分支中-这不是纯粹的优化。

Constexpr for另一方面,则将是纯优化(至少如您所描述的那样,不算循环执行0次的边缘情况),因此最好将其留给“假设”优化规则。

  • “另一方面,Constexpr for 将是纯粹的优化”如果 `constexpr for` 存在,则循环变量将可在常量表达式中使用,例如模板参数列表和 consteval 函数。 (4认同)