Blick auf den C ++ 11-Standard. Ich kann sehen, dass die Spezialisierung von std::tuple_size
und std::tuple_element
für volatile
und const volatile
Tupel bereitgestellt wird.
Aber std::get
bieten keine Spezialisierung für volatile
oder const volatile
tuple.
Ich habe den folgenden Code auf GCC.4.8.1 versucht
%Vor% Ich bekomme den Fehler: no matching function for call to 'get(volatile std::tuple<int, int>&)'
Wenn ich also verstehe, kann ich flüchtige Tupel (const) erzeugen, aber ich kann nicht auf ihre Elemente zugreifen.
Ist das ein erwartetes Verhalten oder ein Versehen?
Vielen Dank.
Dies gilt nicht nur für std::get
, sondern auch für die relationalen Operatoren oder swap
.
Warum unterstützt swap
nicht flüchtige Tupel? Da kein Konstruktor verschieben von tuple
flüchtige Tupel verwendet. Gleiches gilt für den Zuweisungsoperator . Wenn die Standardbibliothek in ihrer Gesamtheit betrachtet wird, stellt fast keine Klasse oder Vorlage tatsächlich Überladungen für flüchtige Objekte bereit 1 . Vielleicht wäre es zu viel Aufwand bei der Standardisierung und Implementierung; Oder vielleicht wurde es als unsinnig angesehen, flüchtige Klassenobjekte zu haben. In beiden Fällen sind flüchtige Tupel derzeit ziemlich unbrauchbar, und das Hinzufügen einer get
-Überladung wäre in Bezug auf den aktuellen Zustand der Schnittstelle inkonsistent.
Die Verwendung von volatile tuple
als Typ (und kein Objekt) ist per se nicht problematisch und könnte nützlich sein. Das und die Tatsache, dass so ziemlich jedes andere Typmerkmal in der Standardbibliothek auch für alle cv-Qualifier spezialisiert ist, führt dazu, dass tuple_element
und tuple_size
es unterstützen.
1 Man kann dies leicht überprüfen, indem man in C ++ - Standard ab Klausel 17 nach volatile
sucht. Man wird feststellen, dass keine Funktion (Template) außer den für Atomics in Klausel 29 für flüchtige Parameter überladen ist.