Warum kann ich nicht bauen eine queue/stack mit brace-enclosed-Initialisierer-Listen? (C++11)
Programm 1:
#include <iostream>
#include <cstdlib>
#include <vector>
int main(){
//compiles successfully
std::vector<int> vec{1,2,3,4,5};
return EXIT_SUCCESS;
}
Programm 2:
#include <iostream>
#include <cstdlib>
#include <queue>
int main(){
//compiler error
std::queue<int> que{1,2,3,4,5};
return EXIT_SUCCESS;
}
Fehlermeldung:
main.cpp: In function ‘int main()’:
main.cpp:7:31: error: no matching function for call to ‘std::queue<int>::queue(<brace-enclosed initializer list>)’
main.cpp:7:31: note: candidates are:
/usr/include/c++/4.6/bits/stl_queue.h:141:7: note: std::queue<_Tp, _Sequence>::queue(_Sequence&&) [with _Tp = int, _Sequence = std::deque<int, std::allocator<int> >]
/usr/include/c++/4.6/bits/stl_queue.h:141:7: note: candidate expects 1 argument, 5 provided
/usr/include/c++/4.6/bits/stl_queue.h:137:7: note: std::queue<_Tp, _Sequence>::queue(const _Sequence&) [with _Tp = int, _Sequence = std::deque<int, std::allocator<int> >]
/usr/include/c++/4.6/bits/stl_queue.h:137:7: note: candidate expects 1 argument, 5 provided
/usr/include/c++/4.6/bits/stl_queue.h:92:11: note: std::queue<int>::queue(const std::queue<int>&)
/usr/include/c++/4.6/bits/stl_queue.h:92:11: note: candidate expects 1 argument, 5 provided
/usr/include/c++/4.6/bits/stl_queue.h:92:11: note: std::queue<int>::queue(std::queue<int>&&)
/usr/include/c++/4.6/bits/stl_queue.h:92:11: note: candidate expects 1 argument, 5 provided
Frage:
warum kann nicht-queues initialisiert werden wie Vektoren?
Ich nehme an, Sie sind nicht-Sequenz-Container, aber warum wäre das wichtig?
Ich bin sicher, es gibt einen guten Grund, aber ich kann nicht finden eine Erklärung.
gcc (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1
Du musst angemeldet sein, um einen Kommentar abzugeben.
Glaube ich nicht, es hat wirklich nichts damit zu tun, container-Adapter eher als Container (obwohl ich gebe zu, ich bin unsicher, warum genau die richtigen Konstruktor weggelassen wird).
Wenn Sie einen verspannten Initialisierungsliste mit
std::vector
, bist du mit dieser (neu in C++11) Konstruktor:Blick auf die definition von
std::queue
die verfügbaren Konstruktoren sind:Einen Konstruktor der Einnahme ein initialization_list ist Auffällig abwesend.
Ich bin mir ziemlich sicher, dass trotz des seins ein container-adapter, wie ein Konstruktor wäre trivial, wenn es gewünscht war. Nur ein Beispiel:
g++ 4.7 akzeptiert diese ohne Probleme, und erzeugt genau die Ausgabe, die Sie erwarten würden:
Obwohl ich noch nicht getestet, mit anderen Compilern, kann ich keinen Grund sehen, andere Compiler würde nicht funktionieren mit diesem als gut (vorausgesetzt, Sie implementieren die notwendigen Funktionen, natürlich).
Edit: ich habe gerade einige suchen durch den Ausschuss Papiere schlägt vor, den Zusatz von initalizer_lists zu C++ (z.B., N1890, N1919, N2100, N2215, N2220) und es sieht für mich wie eine einfache Aufsicht. Viele der früheren Papiere, die mehr ideellen, aber N2220 hat eine ganze Menge von vorgeschlagenen Sprache für die arbeiten auf Papier. Für
std::array
(für ein Beispiel) es wird speziell betont, dass keine änderung erforderlich ist. Es geht dann durchdeque
,vector
,[unordered_][multi_](set|map)
wird, und zeigt die änderungen, die notwendig sind für jede -- aber keine Erwähnung stack oder queue überhaupt, in beide Richtungen. Kein Vorschlag zum hinzufügen von Unterstützung fürstd::initializer_list
noch (wiestd::array
) Gründe für Ihre Unterlassung.Ich würde daraus schließen, dass es war eine einfache Aufsicht, dass das wohl schlüpfte aus zwei Gründen: 1) die Adapter sind fast, aber nicht ganz-Container und 2) die adapter-Klassen scheinen nicht verwendet zu werden, eine ganze Menge, so vergessen Sie war wohl ziemlich einfach (und, natürlich, die immer allgegenwärtig und der Dritte Grund: die meisten der aktiven Mitglieder sind furchtbar überlastet).
Edit2: ich sollte wohl hinzufügen, ein weiteres detail: seit
stack
undqueue
können beide akzeptieren einen anderen Behälter für die Initialisierung, können Sie Sie ziemlich leicht tun, so etwas wie:Dieser etwas ausführlichen, aber unwahrscheinlich, dass dazu führen, Verlust von Effizienz (der container übergeben werden, da eine rvalue-Referenz, so seine Darstellung, "gestohlen" statt kopiert). Es gibt eine Einschränkung allerdings: wenn der Typ der container, die Sie verwenden, entspricht nicht der zugrunde liegenden container die container-adapter, erhalten Sie eine Kopie, eher als eine Bewegung (und damit möglicherweise verlieren einige Effizienz).
std::stack({1, 2, 3})
aber eine Priorität muss ein Vergleich Funktor wie das erste argument. Wenn der Funktor kann Standard gebaut:std::priority_queue<int>({}, {1, 2, 3 })
std::queue
undstd::stack
eigentlich nicht Container, Sie sind so genannte container Adapter verwendet einen container (standardmäßigstd::deque
). Daher können Sie Sie nicht initialisieren, ist es wie die anderen Behälter.Bearbeiten
Für einen container benutzen zu können, eine Initialisierungsliste, es muss über einen Konstruktor verfügen, wobei ein
std::initializer_list
als argument. Die container-Adapter nicht. Ob es absichtlich oder ein versehen des Normen-Ausschuss bis zu anyones interpretation.std::queue
,std::stack
&std::priorityqueue
sind - Container Adapter, Container, gebaut von der Verwendung von anderen standard-Bibliothek Container.