private static const member
-
@Th69 sagte in private static const member:
Ja, das ist ein Unterschied.
Auf was war das bezogen?
Also ich kann das nun so
constexpr static std::string MyConstant = "SomeText" // seit c++ 11
oder so
inline static const std::string MyConst = "SomeText"; // seit c++ 14 ?
implementieren.
Welche Variante sollte ich vorziehen? Bzw. wo sind die Unterschiede / Vorteile / Nachteile?
-
@booster sagte in private static const member:
@Th69 sagte in private static const member:
Ja, das ist ein Unterschied.
Auf was war das bezogen?
Dass es ein unterschiedliches Verhalten gibt. Non-static Konstanten gehören zum Objekt und können nicht zugewiesen werden, daher funktioniert der default-assignment-Operator nicht:
class Test { const int myconst = 1; }; int main() { Test t1, t2; t2 = t1; // Peng! }
-
Ja ok.
Aber nochmals auf die andere Frage hinzuweisen: constexpr oder inline?
-
constexpr
impliziertinline
.
-
@Swordfish sagte in private static const member:
constexpr impliziert inline
dann anders gefragt. constexpr ja oder nein?
-
@booster Ja.
-
Die Frage sollte eher sein, ob man anstatt eines static const std::string nicht doch eher static const char* const nimmt, weil man nie so richtig weiß, ob der Compiler static const std::string entsprechend optimieren kann. Wenn das egal ist, spricht nichts gegen static const std::string.
-
@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.