2014-11-10 9 views
9

Глядя на стандарт C++ 11. Я вижу, что специализация std::tuple_size и std::tuple_element предназначены для volatile и const volatile кортежей.volatile и const volatile std :: tuple и 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>; 

Но std::get не делать никаких предложений специализации для volatile или const volatile кортежа.

Я попытался следующий код на GCC.4.8.1

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

Я получаю сообщение об ошибке: no matching function for call to 'get(volatile std::tuple<int, int>&)'

Так что, если я понимаю, что я могу создать (константные) летучие кортежи, но я не могу получить доступ к их элементам ,

Является ли это ожидаемым поведением или надзором?

Большое спасибо.

+0

Не работает на GCC 4.9, fwiw. – Barry

+0

'const volatile' поражает меня как странную комбинацию. Кто-нибудь знает о его законном использовании? – Cameron

+3

Регистры аппаратного обеспечения компании Cameron, которые не должны быть записаны, но могут быть изменены под вами, например. –

ответ

4

Это не только случай для std::get, но и для relational operators или swap. Почему swap не поддерживает изменчивые кортежи? Потому что move constructortuple берет летучие кортежи. То же самое касается assignment operator. Фактически, при рассмотрении стандартной библиотеки в целом почти ни один класс или шаблон не обеспечивают перегрузки для неустойчивых объектов . Может быть, это будет большая проблема в стандартизации и реализации; Или, возможно, было бессмысленно иметь изменчивые объекты класса. В любом случае волатильные кортежи в настоящее время довольно непригодны для использования, и добавление перегрузки get для них будет по отношению к текущему состоянию интерфейса несовместимым.

Использование volatile tuple в качестве типа (а не объекта) само по себе не является проблематичным и может быть полезным. Это и тот факт, что почти каждая черта другого типа в стандартной библиотеке также специализирована для всех cv-квалификаторов, приводит к поддержке tuple_element и tuple_size.


Можно легко проверить это с помощью поиска volatile в стандарте C++ из пункта 17 на. Будет обнаружено, что никакая функция (шаблон), кроме тех, что для атомистики в разделе 29, не перегружена для изменчивых параметров.

Смежные вопросы