If my code has this constexpr string
constexpr char my_str[] = "hello";
the type of my_str contains information about its size, i.e. sizeof(my_str) is a constant 6, and can be used anywhere a constant is required.
What about strlen(my_str)? Can/should it also be evaluated to a compile-time constant?
Here is an example for yes: https://ideone.com/2U65bN
Here is an example for no: http://coliru.stacked-crooked.com/a/8cb094776dfc5969
What does the Standard say about this? Surely not "maybe"?
21.8, 1 and 2, in the standard says:
Tables 74, 75, 76, 77, 78, and 79 describe headers
<cctype>,<cwctype>,<cstring>,<cwchar>,<cstdlib>(character conversions), and<cuchar>, respectively.The contents of these headers shall be the same as the Standard C Library headers
<ctype.h>,<wctype.h>,<string.h>,<wchar.h>, and<stdlib.h>and the C Unicode TR header<uchar.h>, respectively, with the following modifications:
strlen is defined in in <cstring> in c++. The modifications that follow do not mention strlen. From that, I would conclude that the signature in C++ must be exactly the same as it is in C, and since C does not have constexpr, it is technically non-compliant. That said, this is one of those non-compliant things that's unlikely to do any harm, beyond relying on it on one platform and then not finding it on another.