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";
    	//     ^^^^^
    };
    

  • Mod

    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 und constexpr besteht, ist eben einfach... falsch. VC++ eben.



  • Arcoth schrieb:

    Dass aber ein Unterschied zwischen const constexpr und constexpr besteht, ist eben einfach... falsch. VC++ eben.

    Hat auch niemand behauptet. Deshalb steht da auch "schluckt". 💡


  • Mod

    Ich habe auch nicht behauptet, dass du es behauptet hast. Versuch doch einfach mal anzunehmen, dass ich nicht bescheuerter bin als du. 💡


Log in to reply