2015-05-31 18 views
6

Ich kenne den Unterschied zwischen const und constexpr. Einer ist eine Kompilierzeitkonstante und der andere ist entweder Kompilierzeit oder Laufzeitkonstante.const constexpr char * vs. constexpr char *

Allerdings, für Array von Zeichen/Strings, bin ich verwirrt, warum der Compiler beschwert sich über eines verwendet wird über den anderen.

Zum Beispiel habe ich:

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

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

Mit Erklärung "A" erhalte ich:

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

aber mit der Erklärung "B" Ich habe keine Warnungen erhalten.

Warum wird der zusätzliche const-Qualifier die Warnung los? Sind beide nicht "const char *"? Ich frage, weil beide mit constexpr deklariert sind, die es standardmäßig zu einem machen sollte?

Ich würde A erwarte in Ordnung zu sein: S

+3

"constexpr" gilt für den Zeiger und macht ihn "const", aber nicht das Objekt, auf das er zeigt. Dies ist einer der wenigen Fälle, in denen Sie "const" und "constexpr" kombinieren müssen. – 0x499602D2

+3

'constexpr char *' ist ein 'char * const'. Der "constexpr" -Spezifizierer gilt für den gesamten Typ des Objekts - das heißt, er gilt für die Deklaration -, "const" ist ein Qualifikationsmerkmal (eines Typs). – dyp

Antwort

8

const teilt den Compiler mit, dass die Zeichen nicht zu deuten auf geschrieben werden sollen.

constexpr teilt dem Compiler mit, dass die Zeiger, die Sie in diesen Arrays speichern, zur Kompilierzeit vollständig ausgewertet werden können. Es wird jedoch nicht angegeben, ob die Zeichen, auf die die Zeiger zeigen, sich ändern können.

By the way, eine andere Art und Weise Sie diesen Code schreiben könnte, wäre:

const char * const B[2]; 

Die erste const gilt für die Zeichen und die zweite const auf das Array selbst angewendet und die Zeiger enthält.