Was ist der Unterschied zwischen constexprund const? Wann kann ich nur einen davon verwenden? Wann kann ich beide verwenden und wie soll ich eine auswählen?
constexpr ist ein in C ++ 11 eingeführter Modifikator, der den Compiler darüber informiert, dass der Wert einer Funktion oder Variablen bekannt ist oder zur Kompilierungszeit berechnet werden kann. Als solches kann es als Konstante an Orten verwendet werden, an denen es sonst nicht möglich wäre.
Was ist der Unterschied zwischen constexprund const? Wann kann ich nur einen davon verwenden? Wann kann ich beide verwenden und wie soll ich eine auswählen?
Es scheint mir, dass eine "Funktion, die immer 5 zurückgibt" die Bedeutung von "Aufrufen einer Funktion" bricht oder verwässert. Es muss einen Grund oder eine Notwendigkeit für diese Funktion geben, sonst wäre es nicht in C ++ 11. Warum ist es dort? // preprocessor. #define MEANING_OF_LIFE 42 //...
Wenn ich eine Variable in einer Funktion habe (z. B. ein großes Array), ist es sinnvoll, beide staticund zu deklarieren constexpr? constexprgarantiert, dass das Array zur Kompilierungszeit erstellt wird, wäre das staticalso nutzlos? void f() { static constexpr int x [] = { // a few thousand...
Ich möchte ein static const charArray in meiner Klasse haben. GCC beschwerte sich und sagte mir, ich solle es verwenden constexpr, obwohl es mir jetzt sagt, dass es eine undefinierte Referenz ist. Wenn ich das Array zu einem Nichtmitglied mache, wird es kompiliert. Was ist los? // .hpp struct foo...
Unter Verwendung von C ++ 11, Ubuntu 14.04, GCC Standard-Toolchain . Dieser Code schlägt fehl: constexpr std::string constString = "constString"; Fehler: Der Typ 'const string {aka const std :: basic_string}' der constexpr-Variablen 'constString' ist nicht wörtlich ... weil ... 'std ::...
Betrachten Sie die folgende Inline-Funktion: // Inline specifier version #include<iostream> #include<cstdlib> inline int f(const int x); inline int f(const int x) { return 2*x; } int main(int argc, char* argv[]) { return f(std::atoi(argv[1])); } und die constexpr äquivalente Version: //...
Ganz am Ende von Scott Schurrs Vortrag "Introducing constexpr" auf der CppCon fragt er: "Gibt es eine Möglichkeit, eine Funktion zu vergiften?" Er erklärt dann, dass dies (wenn auch nicht auf standardmäßige Weise) getan werden kann durch: Einfügen throweiner constexprFunktion Ungelöst erklären...
Ich versuche, die Länge eines String-Literals zur Kompilierungszeit zu berechnen. Dazu verwende ich folgenden Code: #include <cstdio> int constexpr length(const char* str) { return *str ? 1 + length(str + 1) : 0; } int main() { printf("%d %d", length("abcd"), length("abcdefgh")); } Alles...
Wo sollte ich Makros bevorzugen und wo sollte ich constexpr bevorzugen ? Sind sie nicht im Grunde gleich? #define MAX_HEIGHT 720 vs. constexpr unsigned int max_height = 720;
Ich habe eine Funktion, die mehrdimensional ist std::vectorund erfordert, dass die Tiefe (oder die Anzahl der Dimensionen) als Vorlagenparameter übergeben wird. Anstatt diesen Wert fest zu codieren, möchte ich eine constexprFunktion schreiben , die die std::vectorund die Tiefe als unsigned...
TL; DR Bevor Sie versuchen, diesen ganzen Beitrag zu lesen, sollten Sie Folgendes wissen: Ich habe eine Lösung für das vorgestellte Problem gefunden , bin aber immer noch gespannt, ob die Analyse korrekt ist. Ich habe die Lösung in eine fameta::counterKlasse gepackt, die einige verbleibende...
Unser Team arbeitet mit einer über 10 Jahre alten C ++ - Codebasis und hat kürzlich auf einen C ++ 17-Compiler umgestellt. Deshalb suchen wir nach Möglichkeiten, unseren Code zu modernisieren. In einem Konferenzgespräch auf YouTube hörte ich den Vorschlag, const char*globale Zeichenfolgen durch zu...
Ich habe mit autoin herumgespielt std::pair. Im folgenden Code soll die Funktion feinen std::pairTyp zurückgeben, der von einem Vorlagenparameter abhängt. Ein Arbeitsbeispiel: BEISPIEL 1 template <unsigned S> auto f() { if constexpr (S == 1) return std::pair{1, 2}; // pair of ints else...
Ich habe mit C ++ 20 Consteval in GCC 10 herumgespielt und diesen Code geschrieben #include <optional> #include <tuple> #include <iostream> template <std::size_t N, typename Predicate, typename Tuple> consteval std::optional<std::size_t>
Ist das gültiges C ++? int main() { constexpr auto sz = __func__ - __func__; return sz; } GCC und MSVC denken, dass es in Ordnung ist, Clang denkt, dass es nicht: Compiler Explorer . Alle Compiler sind sich einig, dass dies in Ordnung ist: Compiler Explorer . int main() { constexpr auto p...
In C ++ 20 std::swapwird eine constexprFunktion. Ich weiß, dass die Standardbibliothek beim Markieren von Dingen wirklich hinter der Sprache zurückgeblieben ist constexpr, aber bis 2017 <algorithm>war sie ziemlich genau wie eine Reihe anderer Dinge. Noch std::swapnicht. Ich erinnere mich...
Ich habe const-Ausdrücke ausprobiert, die zur Kompilierungszeit ausgewertet werden. Aber ich habe mit einem Beispiel gespielt, das unglaublich schnell erscheint, wenn es zur Kompilierungszeit ausgeführt wird. #include<iostream> constexpr long int fib(int n) { return (n <= 1)? n :...
Alle Konstruktoren von std :: span sind als constexpr deklariert, aber ich kann anscheinend keinen von ihnen dazu bringen, in einem constexpr-Kontext zu arbeiten. Das Kommentieren eines der folgenden Constexpr führt zu einem Kompilierungsfehler. #include <array> #include <span> int...
Ist der folgende Code legitim? template <int N> class foo { public: constexpr foo() { for (int i = 0; i < N; ++i) { v_[i] = i; } } private: int v_[N]; }; constexpr foo<5> bar; Clang akzeptiert es, aber GCC und MSVC lehnen es ab. Der Fehler von GCC ist: main.cpp:15:18:...