private static const member
-
@john-0 Und was wäre mit einem
std::string_view
? Hast du da Erfahrungen, wie gut das Compiler optimieren?
-
Ich fasse hier nochmals die Möglichkeiten zusammen.
// 1 const std::string MyConst = "SomeText"; // nicht statisch // 2 inline static std::string MyConst = "SomeText"; // 3 constexpr static std::string MyConstant = "SomeText"; // 4 constexpr static char* MyConstant = "SomeText"; // -> Meldung von Resharper: ISO c++ 11 does not allow conversion from string literal to 'char*' // 5 constexpr static auto MyConstant = "SomeText"; // auto ist in dem Fall auch char* ( aber meckert Resharper nicht.) // 6 constexpr static std::string_view MyConstant = "SomeText"; // 7 constexpr static auto MyConstant = "SomeText"sv; // ebenfalls string_view
wann man jetzt was nimmt wäre jezt zu bewerten.
-
Ich würde zu Nummer 3 tendieren.
-
- möglich, vielleicht nicht optimal
- globale variable, nicht konstant
- std::string Konstruktor ist (noch) nicht constexpr, das geht gar nicht.
- Es sollte heißen:
constexpr static char const*
- ^
- möglicherweise die beste option, aber nur wenn die meisten interfaces umgestiegen sind von
std::string const&
aufstd::string_view
, sonst wird bei übergabe an Funktionen ein String konstruiert.
-
@5cript sagte in private static const member:
std::string Konstruktor ist (noch) nicht constexpr, das geht gar nicht.
das war nur ein test und It0101ist darauf rein gefallen.
nein war natürlich kein Test.Aber das constexpr wurde mir hier ja von allen Seiten wärmstens empfohlen. Und ich nenne jetzt keine Namen.
-
zu 2: hier hatte ich lediglich das static vergessen.
inline static const std::string MyConst= "SomeText";
das geht auch und ist dann wahrscheinlich aktuell die beste Lösung sollange noch keine Durchgängigleit von string_view.
-
Ohne Verwendung ist das eine ziemlich sinnlose Frage. Ich kann mit x Situationen vorstellen in denen ein
string_view
nix bringt. Also per default bin ich für einenchar const * const
.
-
also noch 2 möglichkeiten
@Swordfish sagte in private static const member:
char const * const
// 8 ? char const * const MyConst = "SomeText";
@5cript sagte in private static const member:
- Es sollte heißen: constexpr static char const*
// 9 ? constexpr static char const* MyConstant = "SomeText";
jetzt bin ich verwirrt.
-
Was bedeutet denn
static
was bedeutetconstexpr
? Beantworte dir diese Fragen und sei glücklich.
-
@Swordfish sagte in private static const member:
Beantworte dir diese Fragen und sei glücklich.
Wahnsinns Typ. Für jede Lebenslage eine Antwot.
-
@booster sagte in private static const member:
Beantworte dir diese Fragen und sei glücklich.
Wenn ich mir alle Fragen selber beantworten soll und nicht über irgendwelche Vor und Nachteile diskutieren darf. Für was dann überhaupt dieses Forum.
-
@booster sagte in private static const member:
Wahnsinns Typ. Für jede Lebenslage eine Antwot.
Ja, *sich_durchs_haar_streich*.
-
@Swordfish sagte in private static const member:
sich_durchs_haar_streich.
Muss ja eklig sein bei so viel Schmalz.
-
@booster Das Forum ist da um Fragen zu stellen, aber nicht um Google vollständig zu ersetzen. Von dir zu erwarten, dass du nachgucken kannst, was static bedeutet und was constexpr bedeutet ist denke ich eine Aufgabe, die du bewältigen kannst
-
@booster sagte in private static const member:
@Swordfish sagte in private static const member:
*sich_durchs_haar_streich*.
Muss ja eklig sein bei so viel Schmalz.
Die sind frisch gewaschen ...
-
@Leon0402 Nicht immer pauschal auf die Seite stellen von den Leuten die hier schon länger dabei sind.
Natürlich kann ich das, um das geht es doch jetzt gar nicht
static: Inside a class definition, the keyword static declares members that are not bound to class instances.
constexpr: The constexpr specifier declares that it is possible to evaluate the value of the function or variable at compile time.Ist jetzt die Frage beantwortet welche Variante ich bevorzugen soll. swordfish hat mir oben noch empfohlen constexpr zu verwenden. Geht im Fall von std::string gar nicht.
Und weiterhin gehen die Antworten hier auseinander welche Variante ich nehmen soll. Es reicht also nicht einfach nur aus die genannte Frage zu beantworten.
Wo ich @Swordfish recht gebe ist dass man den Anwendungsfall betrachten muss um die Entscheidung zu treffen.
-
@booster wenn möglich und sinnvoll immer
constexpr
. Wenn nicht möglich, weil ggf. erst zur runtime konstant,const
.
static
wird genutzt, wenn es sinnvoll und logisch ist. Einconstexpr
muss dabei allerdings static sein.static
hat dabei weiterhin den Vorteil, dass nur einmal Speicher benötigt wird, wenn der String sowieso von der Instanz unabhängig ist.
Für compile time strings würde ichconst char*
nutzen, weil einstd::string
dafür schlicht und ergreifend überflüssig ist und keine wirklichen Vorteile bietet.
-
@booster sagte in private static const member:
Nicht immer pauschal auf die Seite stellen von den Leuten die hier schon länger dabei sind.
Tue ich nicht und wie du darauf kommst ist mir schleierhaft.
Hast du denn die Erklärung von static verstanden? Wenn ja, sollte dir klar sein, dass die Frage, ob die Variable static sein soll oder nicht ohne Anwendungsfall nicht beantwortbar ist. Wie @Unterfliege gesagt hat, ist constexpr immer sinnvoll, wenn es geht, da es zur Compilerzeit ausgewertet wird. Wenn die Variable nicht static ist, geht das aber nicht und macht auch keinen Sinn ... du kannst dann höchstens den Konstruktor constexpr machen und die Instanz. Das zweite Kriterium ist dann natürlich noch, ob deine Typen überhaupt constexpr unterstützen, in dem Fall tut es std::string nicht, char const* schon, wenn es static ist.Du sieht also es hängt erstmal davon ab, ob deine Variable static ist oder nicht. Um das zu beurteilen, muss man die Bedeutung davon verstanden haben.