Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Evaluating strlen at compilation time?

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"?

like image 284
anatolyg Avatar asked Sep 07 '17 16:09

anatolyg


2 Answers

In C++17 you can use std::char_traits::length, which is constexpr, instead of strlen.

like image 147
eyelash Avatar answered Nov 02 '22 15:11

eyelash


21.8, 1 and 2, in the standard says:

  1. Tables 74, 75, 76, 77, 78, and 79 describe headers <cctype>, <cwctype>, <cstring>, <cwchar>, <cstdlib> (character conversions), and <cuchar>, respectively.

  2. 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.

like image 39
Nir Friedman Avatar answered Nov 02 '22 15:11

Nir Friedman