It’s too bad you still can’t cast a char to a uint8_t though in a constexpr expression.
It’s too bad you still can’t cast a char to a uint8_t though in a constexpr expression.
#include <cstdint>
#include <print>
constexpr uint8_t f(char ch) {
return static_cast<uint8_t>(ch);
}
int main() {
constexpr uint8_t r = f('a');
std::print("{}", r);
}Could be wrong I am no expert…
What is possible in constexpr contexts has been improving in each revision, the end goal is to support the whole language, eventually.
Naturally introducing everything at once would be too hard in a language with such a big ecosystem like C++.
Uh, what? That has worked fine since the introduction of constexpr in C++11.
constexpr auto f(uint8_t *x) {
return std::bit_cast<char *>(x);
}
https://godbolt.org/z/K3f9b9GGsAh that’s what bitcast is for, neat!
Here the `constexpr` keyword means the function might be called in a constant-evaluated context. f doesn't need to have all its statements be able to be evaluated in constexpr, only those which are actually used are. You need to explicitly instantiate a constexpr variable to test this.
cppreference is very clear* about this, regarding bit_cast: https://en.cppreference.com/w/cpp/numeric/bit_cast
The consteval specifier declares a function or function template to be an immediate function, that is, every potentially-evaluated call to the function must (directly or indirectly) produce a compile time constant expression.
It's possible that the compiler just doesn't bother as long as you aren't actually calling the function.