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"?
In C++17 you can use std::char_traits::length
, which is constexpr
, instead of strlen
.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With