On Mon, 27 Apr 2020 at 04:54, Laleh Aghababaie via Gcc <gcc@gcc.gnu.org> wrote:
>
> Hi all,

N.B. this is the wrong mailing list for such a question, you should
have used the gcc-help list instead.

> I have a question about the constexpr variable specifications and how the 
> compiler handles them. The constexpr specifier declares that it is possible 
> to evaluate the value of the function or variable “at compile time”. If we 
> look at the bellow simplified example:
>
> int func(){
>         int sum = 0;
>         for (int i = 0; i < 3; i++){
>                 constexpr int j = i;
>                 sum +=j;
>         }
>         return sum;
> }
>
> The compiler will throw an error as:
>
> “The value of ‘i' is not usable in a constant expression.”
> However the value of ‘i’ is known during the compile time, and if I unroll 
> this computation myself it works perfect, so why the compiler is not able to 
> do that?

The compiler *could* do it, but the rules of the C++ standard do not
allow a constexpr variable to have an initializer that is nto a
constant expression. The loop variable i is not a constant expression,
obviously, because its value changes.

> The main reason I am asking this is because I want to call a constexpr 
> function for a few iteration which is known at compile time (instead of that 
> “sum” in the for loop) , but using the iteration number in the call is 
> prohibited, even though the number of iterations and iteration number  is 
> known during the compile time to do the sum. When unrolling it by hand works, 
> why the compiler refuses to handle this situation?

Because it's not valid C++.

If you want to process a sequence of integer constants there are
various metaprogramming techniques you can use e.g create
std::integer_sequence<int, 0, 1, 2, 3> and pass it to a function
template that accepts an int... pack, and expands it in a fold
expression.

Reply via email to