Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

C++11 Compliance

Boost , The Boost C++ Libraries BoostBook Documentation Subset , Chapter 41. Boost.Unordered

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Поддержка семантики движения реализуется с помощью Boost. Пошли. Если ссылки на значение r доступны, они будут использовать их, но если нет, то используется близкая, но несовершенная эмуляция. На таких компиляторах:

  • Некопируемые объекты могут храниться в контейнерах. Они могут быть построены на месте, используяместо, или если они поддерживают Boost. Двигайся, двигайся.
  • Сами контейнеры не являются подвижными.
  • Пересылка аргументов не идеальна.

В C++11 появилась новая система распределения. Он обратно совместим из-за слабых требований к распределителям в старом стандарте, но может потребоваться некоторые изменения для распределителей, которые работали со старыми версиями неупорядоченных контейнеров. Использует класс признаковallocator_traitsдля обработки распределителя, добавляющего дополнительную функциональность и делающего некоторые методы и типы необязательными. При разработке стабильного выпускаallocator_traitsне было доступно, поэтому в этой версии всегда используется внутренняя частичная реализация. Будем надеяться, что будущая версия будет использовать стандартную реализацию.

Функции-членыконструируют,разрушаютиmax_sizeтеперь являются необязательными, если они недоступны, используется запасной вариант. Полная реализациячерт распределителятребует сложного обнаружения функции члена, так что запасной вариант используется всякий раз, когда вызов функции члена плохо сформирован. Для этого требуется поддержка выражений SFINAE, которые доступны на GCC из версий 4.4 и Clang.

На других компиляторах есть только тест, чтобы увидеть, есть ли у распределителя член, но нет проверки, что его можно назвать. Поэтому вместо использования резервного копирования будет просто ошибка компиляции.

propagate_on_container_copy_assignment,propagate_on_container_move_assignment,propagate_on_container_swapиselect_on_container_copy_constructionтакже поддерживаются. Из-за несовершенной эмуляции движения некоторые назначения могут проверятьраспространение_on_container_copy_assignmentна некоторых компиляторах ираспространение_on_container_move_assignmentна других.

Использование методов построения и разрушения распределителя может быть немного удивительным. Узлы строятся и разрушаются с помощью распределителя, но элементы хранятся в выровненном пространстве внутри узла и строятся и разрушаются путем вызова конструктора и деструктора напрямую.

В C++11 функция построения распределителя имеет подпись:

template <class U, class... Args>
void construct(U* p, Args&&... args);

(52)для содержащегося объекта, но большинство существующих распределителей не поддерживают это. Если обнаружение функции члена было достаточно хорошим, то со старыми распределителями оно возвращалось бы к вызову конструктора элемента напрямую, но в целом обнаружение недостаточно хорошо для этого. Неупорядоченный просто звонит конструктору каждый раз. В большинстве случаев это будет работать нормально.

указательные чертыне используются. Вместо этого, типы указателей получают из распределителей отскока, это может вызвать проблемы, если распределитель не может быть использован с неполными типами. Еслиconst_pointerне определен в распределителе,boost::pointer_to_other<pointer,constvalue_type>::typeиспользуется для получения const pointer.

Поскольку контейнеры используютstd::пара, они ограничены версией из текущей стандартной библиотеки. Но поскольку C++11std::pairpiecewise_constructBased constructor очень полезен,Emplaceэмулирует егоpiecewise_constructвboost:неупорядоченноепространство имен. Так, например, будет работать следующее:

boost::unordered_multimap<std::string, std::complex> x;
x.emplace(
    boost::unordered::piecewise_construct,
    boost::make_tuple("key"), boost::make_tuple(1, 2));

Старые проекты стандарта также поддерживали вариадные конструкторы дляstd::пары, где первый аргумент будет использоваться для первой части пары, а оставшийся для второй части.

При заменеPredиHashв настоящее время не заменяются вызовомswap, используются их конструкторы копий. Как следствие, при замене исключения могут быть выброшены из их конструктора копий.

Аргументы вариадного конструктора дляместаиспользуются только тогда, когда доступны как ссылки на значение r, так и параметры вариадных шаблонов. В противном случаеместоможет принимать только до 10 аргументов конструкторов.


PrevUpHomeNext

Статья C++11 Compliance раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 41. Boost.Unordered может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Chapter 41. Boost.Unordered ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 17:44:10/0.0092289447784424/1