4 ms·
Am I correct in understanding that, contrary to the Turing completeness of C++ template instantiations, the (compile time) computational power of these Constant
by gghh 10y ago
Am I correct in understanding that, contrary to the Turing completeness of C++ template instantiations, the (compile time) computational power of these Constant Expressions thing is intentional?
- JoshTriplett 10y agoYes. A "constexpr" function can use a large subset of C++, including calls to other constexpr functions, but the compiler guarantees to evaluate it at compile time, so you can use it where the compiler expects a compile-time constant.
- eloff 10y agoMuch saner than abusing templates for this purpose. Faster, better error messages, and miles more readable. I look forward to the day when all the metaprogramming inside boost is rewritten to use constexpr.
- makapuf 10y agoMetaprogramming is different than compile time programming. I agree with templates being abused as a compile time programming language but they are used as Metaprogramming just fine (well, or not but that's their primary usage)
- zmodem 10y ago> the compiler guarantees to evaluate it at compile time It doesn't guarantee that. For example: static constexpr int fac(int x) { return x <= 1 ? 1 : x * fac(x - 1); } int f() { return fac(4); // May or may not be evaluated at run-time. } char arr[fac(4)]; // fac(4) is evaluated at compile-time.
- JoshTriplett 10y agoI should have said, "guarantees that it can evaluate it at compile time if needed, such that you can use it where the compiler expects a compile-time constant expression". Yes, the compiler can choose to defer it until runtime in some cases.