2014-11-10 8 views
9

Blick auf den C++ 11-Standard. Ich kann sehen, dass Spezialisierung von std::tuple_size und std::tuple_element für volatile und const volatile Tuple zur Verfügung gestellt werden.volatile und const flüchtige std :: tuple und std :: get

template <size_t I, class T> class tuple_element<I, volatile T>; 
template <size_t I, class T> class tuple_element<I, const volatile T>; 

template <class T> class tuple_size<volatile T>; 
template <class T> class tuple_size<const volatile T>; 

Aber std::get tun kein Angebot Spezialisierung für volatile oder const volatile Tupels.

Ich habe versucht, den folgenden Code auf GCC.4.8.1

volatile std::tuple<int, int> a(1, 1); 
std::cout << "a<0>=" << std::get<0>(a) << "\n"; 

ich Fehler: no matching function for call to 'get(volatile std::tuple<int, int>&)'

Wenn ich also verstehe ich (const) volatile Tupeln schaffen kann, aber ich kann nicht ihre Elemente zugreifen .

Ist dies ein erwartetes Verhalten oder ein Versehen?

Vielen Dank.

+0

Funktioniert nicht auf GCC 4.9 entweder, fwiw. – Barry

+0

'const volatile' erscheint mir als komische Kombination. Wer weiß von einem legitimen Gebrauch davon? – Cameron

+3

@Cameron Hardware-Register, in die nicht geschrieben werden soll, die jedoch unter Ihnen geändert werden können. –

Antwort

4

Dies ist nicht nur der Fall für std::get sondern auch für die relational operators oder swap. Warum unterstützt swap keine flüchtigen Tupel? Weil move constructor von tuple flüchtige Tupel verwendet. Gleiches gilt für die assignment operator. Wenn die Standardbibliothek in ihrer Gesamtheit betrachtet wird, bietet fast keine Klasse oder Vorlage tatsächlich Überladungen für flüchtige Objekte . 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 jedem Fall sind flüchtige Tupel derzeit ziemlich unbrauchbar, und das Hinzufügen einer get Überlast für sie würde in Bezug auf den aktuellen Zustand der Schnittstelle inkonsistent sein.

Mit volatile tuple als Typ (und kein Objekt) ist nicht per se problematisch und könnte nützlich sein. Das und die Tatsache, dass so ziemlich jeder einzelne Typentyp in der Standardbibliothek auch auf alle CV-Qualifier spezialisiert ist, führt dazu, dass tuple_element und tuple_size dies unterstützen.


Man kann dies leicht überprüfen, für volatile in dem C++ Standard von Klausel 17 auf durch die Suche. Man wird feststellen, dass keine Funktion (Template) außer denen für Atomics in Klausel 29 für flüchtige Parameter überladen ist.

Verwandte Themen