Hi Niall Douglas,
If it is constexpr, it can only be modified in a constexpr evaluation context, and otherwise not.
When a variable is declared as constexpr, it seems it’s also const, constexpr int foo() { constexpr int i = 5; i = 6; return i; } int main () { constexpr int j = foo(); return 0; } foo is a constexpr evaluation context, but modification of i in it will still leads to compile error.
• Values, though not keys nor number of items, are modifiable.
So I think this feature is also challenging. In your crack, https://goo.gl/eO7ooa https://goo.gl/eO7ooa, if I add cmap[0] = “orange”; in main function, it will leads to compile error.
// Challenging: needs to only generate code loading immediately from a memory location. // It must NOT generate any additional runtime overhead like hashing nor searching. const char *what_is_8 = cmap[8];
I find some macro which can force constexpr function evaluation (Add it in your crack) #define AT_CONSTEXPR_KEY(_MAP, _KEY) [&_MAP, &_KEY](){constexpr auto value = _MAP[_KEY]; return value;}() #define AT_TEMP_KEY(_MAP, _KEY) [&_MAP](){constexpr auto value = _MAP[_KEY]; return value;}() constexpr int key = 5; const char* foo1 = AT_CONSTEXPR_KEY(cmap, key); const char* foo2 = AT_TEMP_KEY(cmap, 8); It indeed generates no additional code, but I don’t know how to unify these two macros. In addition, following expression will leads to compile error as lambda function can’t be constexpr now. constexpr const char* foo1 = AT_CONSTEXPR_KEY(cmap, key); constexpr const char* foo2 = AT_TEMP_KEY(cmap, 8); Shangtong Zhang, Senior Student, School of Computer Science, Fudan University, PRC.