static constexpr char array initialisieren
-
hola leute
folgender code macht was er soll:
struct test { static constexpr char name[] = {'d','a','s',' ','i','s','t',' ','e','i','n',' ','t','e','s','t','\0'}; static constexpr int size = sizeof(name) - 1; };
der eine oder andere kann sich vorstellen das die initialisierung des char arrays recht umstaendlich und auch fehleranfaellig ist. gibt es noch einen andere moeglichkeit dafuer ?
ich koennte natuerlich auch folgendes machen:
static constexpr char *name = "das ist ein test"; static constexpr int size = sizeof(name) - 1;
dann liefert size aber nur noch die groesse des char_pointers zurueck und nicht die laenge des strings.
Meep Meep
-
Ich bin mir grad nicht sicher, aber pack mal {} um das Stringliteral, dann ist es wieder ein Array.
-
meinst du so ?
static constexpr char name[] = {"das ist ein test"};
nein nimmt er auch nicht.
error C2440: "Initialisierung": "const char [17]" kann nicht in "char [1]" konvertiert werden
bin aber grad draufgekommen wie ich es auch machen kann:
inline constexpr int length(const char* str) { return *str ? 1 + length(str + 1) : 0; } struct test { static constexpr char *name = "das ist ein test"; static constexpr int size = length(name); };
Meep Meep
-
Das ist ja schon merkwürdig.
Hier (gcc 4.8, mit -Wall -Wpedantic -std=c++11) kompiliert folgendes problemlos:
#include<iostream> int main() { static constexpr char name[] = "das ist ein test"; static constexpr char name2[] = {"das ist noch ein test"}; std::cout << name << " " << sizeof(name) << "\n" << name2 << " " << sizeof(name2) << "\n"; }
Ich bin bislang auch noch nicht auf die Idee gekommen, einen String durch einzelne Chars aufzuschreiben. Ich sehe auch nicht, was da irgendwo in char[1] konvertiert werden müsste.
-
in der main funktioniert es ja bei mir auch. aber sobald ich das in ein struct packe, gibts fehler. test es mal bitte bei dir aus:
struct test { static constexpr char name[] = "das ist ein test"; static constexpr char name2[] = {"das ist noch ein test"}; };
da bekomm ich:
1>c:\users\hgcon\documents\visual studio 2015\projects\webfleet\webfleet\main.hpp(9): error C2131: Ausdruck wurde nicht zu einer Konstanten ausgewertet. 1> c:\users\hgcon\documents\visual studio 2015\projects\webfleet\webfleet\main.hpp(9): note: Fehler wurde durch einen nicht auswertbaren Zeigerwert verursacht 1>c:\users\hgcon\documents\visual studio 2015\projects\webfleet\webfleet\main.hpp(10): error C2440: "Initialisierung": "const char [22]" kann nicht in "char [1]" konvertiert werden 1> c:\users\hgcon\documents\visual studio 2015\projects\webfleet\webfleet\main.hpp(10): note: Der Zeichenfolgenliteral ist zu lang.
-
msvc schluckt
struct test { static const constexpr char name[] = "das ist ein test"; // ^^^^^ };
-
static constexpr char name2[] = {"das ist noch ein test"};
… ist nur gültig seit CWG 1490 resolved wurde, was nicht einmal in C++14 enthalten ist; das kann man noch durchgehen lassen.
Das aber ein Unterschied zwischen
const constexpr
undconstexpr
besteht, ist eben einfach... falsch. VC++ eben.
-
Arcoth schrieb:
Dass aber ein Unterschied zwischen
const constexpr
undconstexpr
besteht, ist eben einfach... falsch. VC++ eben.Hat auch niemand behauptet. Deshalb steht da auch "schluckt".
-
Ich habe auch nicht behauptet, dass du es behauptet hast. Versuch doch einfach mal anzunehmen, dass ich nicht bescheuerter bin als du.