Als «c++» getaggte Fragen

C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entwickelt und hat eine ähnliche Syntax, ist aber jetzt eine völlig andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. Verwenden Sie ein versionierungsspezifisches Tag für Fragen zu einer bestimmten Standardversion [C ++ 11], [C ++ 14], [C ++ 17] oder [C ++ 20] usw.

1
Warum wird static_cast für die Implementierung von is_nothrow_constructible durch gcc benötigt?
Aus der GCC-Implementierung entnommen, type_traitswarum hier static_castbenötigt wird? template <typename _Tp, typename... _Args> struct __is_nt_constructible_impl : public integral_constant<bool, noexcept(_Tp(declval<_Args>()...))> {}; template <typename _Tp, typename _Arg> struct __is_nt_constructible_impl<_Tp, _Arg> : public integral_constant<bool, // Why is `static_cast` needed here? noexcept(static_cast<_Tp>(declval<_Arg>()))> {};

1
Unqualified sort () - Warum wird es kompiliert, wenn es auf std :: vector und nicht auf std :: array verwendet wird, und welcher Compiler ist korrekt?
Beim Aufrufen std::sort()eines std::array: #include <vector> #include <array> #include <algorithm> int main() { std::vector<int> foo{4, 1, 2, 3}; sort(begin(foo), end(foo)); std::array<int, 4> foo2{4, 1, 2, 3}; sort(begin(foo2), end(foo2)); } Sowohl gcc als auch clang geben einen Fehler bei der Sortierung auf dem std::array- clang zurück Fehler: Verwendung des nicht deklarierten …
11 c++  c++17 

3
Wie finde ich heraus, welche Funktionen der Compiler generiert hat?
Ich kenne vom Compiler generierte Funktionen, die Dreierregel und die Fünferregel. In realen Szenarien ist es möglicherweise nicht trivial, genau herauszufinden, welche der vom Compiler generierten Funktionen (Konstruktoren, Zuweisungsoperatoren, Destruktoren) tatsächlich vom Compiler erstellt wurden. Gibt es eine Möglichkeit, die vom Compiler generierten Funktionen für eine bestimmte Klasse aufzulisten? Ich …
11 c++  c++11 


2
Muss T ein vollständiger Typ sein, um in `std :: declval <T>` verwendet zu werden?
Betrachten Sie dieses Beispiel (von hier ): #include &lt;type_traits&gt; #include &lt;iostream&gt; template &lt;typename U&gt; struct A { }; struct B { template &lt;typename F = int&gt; A&lt;F&gt; f() { return A&lt;F&gt;{}; } using default_return_type = decltype(std::declval&lt;B&gt;().f()); }; int main() { B::default_return_type x{}; std::cout &lt;&lt; std::is_same&lt; B::default_return_type, A&lt;int&gt;&gt;::value; } Es wird …


5
Wird der Destruktor eines lokalen Objekts in einer Schleife garantiert vor der nächsten Iteration aufgerufen?
Wenn ich eine Schleife habe und innerhalb dieser Schleife eine neue Stapelvariable erstelle (ohne sie auf dem Heap zuzuweisen und die Variable, die sie im Schleifenkörper deklariert hält), wird der Destruktor dieses Objekts garantiert aufgerufen, bevor die nächste Iteration beginnt oder möglicherweise Schleife Abwickeln durch den Compiler etwas daran ändern?
11 c++  destructor 

1
std :: function const Korrektheit
Angenommen, ich habe einen aufrufbaren Typ wie folgt: struct mutable_callable { int my_mutable = 0; int operator()() { // Not const return my_mutable++; } }; Beachten Sie, dass mutable_callablees eine Nicht-Konstante gibt operator(), die eine Mitgliedsvariable ändert ..... Angenommen, ich erstelle ein std::functionOut aus meinem Typ: std::function&lt;int()&gt; foo = mutable_callable{}; …

1
Kann Span constexpr sein?
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 &lt;array&gt; #include &lt;span&gt; int main() { constexpr int carray[3] = { 0, 1, 2 }; …
11 c++  constexpr  c++20 



5
C ++ ternäre Zuordnung von Lambda
Irgendeine Idee, warum das folgende Snippet nicht kompiliert wird? Es beschwert sich mit einem Fehler "Fehler: Operanden zu ?: Haben verschiedene Typen" auto lambda1 = [&amp;](T&amp; arg) { ... }; auto lambda2 = [&amp;](T&amp; arg) { ... }; auto lambda = condition ? lambda1 : lambda2;



2
Der Aufruf von Lambda ist trotz expliziter Angabe des Rückgabetyps nicht eindeutig
Eine überladene Funktion sollte beide Funktoren aufnehmen, da der Lambda-Typ entscheidbar ist (umsetzbar auf einen std::function(bitte korrigieren Sie mich, wenn ich falsch liege). Die Frage ist: Warum gibt es unten einen Kompilierungsfehler, obwohl der Lambda-Typ explizit ist definiert? ( [&amp;]() -&gt; Type {}) Bitte beachten Sie, dass ich für meine …

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.