String literals are specified to have static storage duration. That means references are valid at least until main returns. In practice string literals are immortal and references to them are always valid.
`constexpr` isn't "compile time". It's potentially compile time at best. Debug builds in particular will go out of their way to evaluate things at runtime, presumably so you can set breakpoints and step through code, even when it's completely pointless. I have seen the following function show up in a profiler:
This was used to silence warnings about unconditional branches in a macro. There are ways to force such functions to be evaluated at compile time, but they're pretty awkward, and limited to integral types (you can't use them on string_view s):
#define EVAL_AT_COMPILE_TIME(x) std::integral_constant<decltype(x), x>::value
const bool x = EVAL_AT_COMPILE_TIME(IsEnabled<true>());
Seems to me the good news is that your compiler told you this doesn't work.
In languages where you can't tell the compiler you think this is constant, there's a risk you delude yourself, especially because computers are very fast, and you think you've got O(1) when it's actually O(N) or even O(N^2) and one day N gets big enough and you're in real trouble.
Yeah, because I am one of those persons that when I use languages like C and C++, and have the last word, the seatbelt and metal gloves are always turned on.
Those examples for HN recreation naturally weren't written with such care.