简体   繁体   中英

const constexpr char* vs. constexpr char*

I know the difference between const and constexpr. One is a compile time constant and the other is either compile time or runtime constant.

However, for array of chars/strings, I'm confused why the compiler complains about one being used over the other.

For example I have:

constexpr char* A[2] = {"....", "....."};

const constexpr char* B[2] = {"....", "....."};

With declaration "A" I get:

ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]

but with declaration "B" I get no warnings.

Why does the extra const qualifier get rid of the warning? Aren't both of them "const char*" anyway? I ask because both are declared with constexpr which should make it a const char* by default?

I'd expect A to be fine :S

const tells the compiler that the chars you are pointing to should not be written to.

constexpr tells the compiler that the pointers you are storing in those arrays can be totally evaluated at compile time. However, it doesn't say whether the chars that the pointers are pointing to might change.

By the way, another way you could write this code would be:

const char * const B[2];

The first const applies to the chars, and the second const applied to the array itself and the pointers it contains.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM