Типобезопасно хранит ровно одно значение из определенного набора типов с условной безопасностью относительно исключений.
СОЗДАНО ИИне провереноМодель: gemini-3.8-flash-medium · Усилие: medium · Температура: не регулируется · Промпт: 223b5b60b80cПроисхождениеОткрытые вопросы (2)
переведено с немецкого руководстваgemini-3.8-flash-low · 2026-10-13 · Немецкий оригинал
Типобезопасно хранит ровно одно значение из определенного набора типов с условной безопасностью относительно исключений.
Шаблонный класс ara::core::Variant служит типобезопасным объединением (union) для хранения ровно одного значения из заданного набора типов и управления им [SWS_CORE_01649]. Он поддерживает гибкие механизмы конструирования, присваивания и emplace, а также позволяет определять активную альтернативу через index()[SWS_CORE_01665]. Важнейшей особенностью по сравнению со стандартом являются модифицированные условные noexcept-спецификации всех модифицирующих операций, а также защита от состояния valueless_by_exception()[SWS_CORE_01666].
Контекст
Шаблонный класс ara::core::Variant представляет собой типобезопасное объединение для AUTOSAR Adaptive Platform, подключаемое через заголовочный файл ara/core/variant.h. Он инкапсулирует управление ровно одним значением из списка типов, определенного во время компиляции (template <typename... Types> class Variant). Определение принципиально ориентируется на поведение std::variant из стандарта C++ [variant], однако имеет специфические отличия AUTOSAR в части спецификации исключений. Описание класса в составе метаданных ссылается на [basic.string]; интерпретация: в данном случае речь, вероятно, идет о редакционной неточности, поскольку все требования согласованно ссылаются на раздел стандарта [variant]. Вопрос Q-809de1af74fcb689 (открытый)
Жизненный цикл
Экземпляр ara::core::Variant проходит детерминированные фазы жизненного цикла от инициализации через смену значения до уничтожения. Создание происходит либо через конструктор по умолчанию без параметров [SWS_CORE_01649], инициализирующий первую альтернативу, либо через конструкторы копирования и перемещения [SWS_CORE_01650], [SWS_CORE_01651], либо путем прямой передачи значения [SWS_CORE_01652]. Кроме того, доступны перегрузки для конструирования на месте (in-place) с помощью in_place_type_t[SWS_CORE_01653], [SWS_CORE_01654], а также in_place_index_t[SWS_CORE_01655], [SWS_CORE_01656], в том числе в сочетании со списками инициализации.
В обычном состоянии объект всегда содержит допустимую альтернативу, отсчитываемый от нуля индекс которой можно определить с помощью метода index()[SWS_CORE_01665]. Если смена значения во время конструирования или присваивания завершается сбоем из-за выброса исключения, экземпляр переходит в состояние valueless_by_exception()[SWS_CORE_01666]. Объект остается в этом состоянии до тех пор, пока в результате успешной повторной инициализации снова не будет занята допустимая альтернатива. Деструктор надлежащим образом уничтожает удерживаемый в данный момент объект и объявлен условно безопасным относительно исключений [SWS_CORE_01657].
Типичный процесс использования включает инстанциацию, присваивание или замену содержимого, запрос состояния и обмен значениями:
Инициализация: создание экземпляра с помощью одного из конструкторов, например путем прямой передачи значения [SWS_CORE_01652] или явно по типу с помощью in_place_type_t[SWS_CORE_01653].
Проверка состояния: запрос индекса активного типа через index()[SWS_CORE_01665], а также защита от предшествующих ошибок через valueless_by_exception()[SWS_CORE_01666].
Обмен объектов: эффективный обмен двух экземпляров Variant через функцию-член swap()[SWS_CORE_01667].
Поскольку рассматриваемый набор записей спецификации охватывает исключительно функции-члены, прямые операции чтения, такие как доступ к значению, отсутствуют; вероятно, функции доступа и обхода (аналогично std::get или std::visit) предоставляются как свободные вспомогательные функции в пространстве имен ara::core. Вопрос Q-75847ac18088da57 (открытый)
Сценарии ошибок
В центре обработки ошибок находится свойство условной безопасности относительно исключений (conditionally exception safe). В то время как стандартная библиотека предусматривает для std::variant фиксированные правила noexcept, AUTOSAR целенаправленно отклоняется: все конструкторы [SWS_CORE_01650], [SWS_CORE_01653], операторы присваивания [SWS_CORE_01658], операции emplace[SWS_CORE_01661], [SWS_CORE_01663], функция обмена swap()[SWS_CORE_01667], а также деструктор [SWS_CORE_01657] условно noexcept. Их гарантия безопасности исключений напрямую зависит от свойств noexcept конструкторов базовых типов.
Если конструирование нового значения во время присваивания или вызова emplace выбрасывает исключение, вариант может перейти в недопустимое промежуточное состояние. Об этом сигнализирует valueless_by_exception()[SWS_CORE_01666]. Исключительно две функции запроса index()[SWS_CORE_01665] и valueless_by_exception()[SWS_CORE_01666] предоставляют безоговорочную гарантию noexcept и полностью безопасны относительно исключений.
Настоящее руководство основано на спецификации AUTOSAR для Adaptive Platform (Release R25-11, модуль core) и подготовлено с помощью ИИ-ассистента курации.
As per corresponding usage in [variant] except for the following deviations: 1. Function is conditionally noexcept
СОЗДАНО ИИне провереноМодель: gemini-3.8-flash-medium · Усилие: medium · Температура: не регулируется · Промпт: 0fe1e0b61069ПроисхождениеОткрытые вопросы (1)
переведено с немецкого руководстваgemini-3.8-flash-low · 2026-10-13 · Немецкий оригинал
Функция-член emplace конструирует альтернативное значение типа T непосредственно в существующем экземпляре ara::core::Variant[SWS_CORE_01661]. Функция предоставляется через заголовочный файл #include "ara/core/variant.h" и выполняется синхронно [SWS_CORE_01661]. В качестве параметров она принимает универсальные ссылки (forwarding references) args..., которые передаются в конструктор целевого типа T, и возвращает ссылку на вновь созданный объект [SWS_CORE_01661].
В отношении обработки ошибок операция объявлена как условно безопасная относительно исключений («conditionally exception safe») [SWS_CORE_01661]. Она следует стандартному поведению variant, однако отличается условной спецификацией noexcept: исключение исключается тогда и только тогда, когда выполняется std::is_nothrow_constructible<T, Args...>::value[SWS_CORE_01661]. Специфические коды ошибок AUTOSAR или сообщения в DET или DEM для этой базовой функции не определены.
Относительно параллелизма и контекста вызова спецификация не указывает каких-либо отклоняющихся гарантий. Интерпретация: одновременный доступ на запись нескольких потоков к одному и тому же экземпляру Variant через emplace без внешней синхронизации, вероятно, не является потокобезопасным, поскольку AUTOSAR ссылается на стандартную семантику variant. Вопрос Q-4d9d118b9916a3dc (открытый)
As per corresponding usage in [variant] except for the following deviations: 1. Function is conditionally noexcept
СОЗДАНО ИИне провереноМодель: gemini-3.8-flash-medium · Усилие: medium · Температура: не регулируется · Промпт: a346c9068921ПроисхождениеОткрытые вопросы (2)
переведено с немецкого руководстваgemini-3.8-flash-low · 2026-10-13 · Немецкий оригинал
Функция-член emplace класса ara::core::Variant из заголовочного файла ara/core/variant.h служит для синхронного создания альтернативы типа T непосредственно в памяти существующего экземпляра [SWS_CORE_01662]. При этом std::initializer_list<U>, а также перенаправленные аргументы Args&&... args передаются в конструктор типа. В качестве возвращаемого значения функция возвращает lvalue-ссылку T& на вновь инициализированный объект [SWS_CORE_01662].
Что касается обработки ошибок и исключений, функция отклоняется от стандартного определения в [variant]: она классифицирована как условно безопасная относительно исключений (conditionally exception safe) и имеет условную спецификацию noexcept[SWS_CORE_01662]. Вызов гарантирует отсутствие исключений, если std::is_nothrow_constructible<T, std::initializer_list<U>&, Args&&...>::value вычисляется в true[SWS_CORE_01662]. Специфические коды ошибок AUTOSAR или каналы сообщений в DET и DEM для этого элемента отсутствуют.
Относительно параллелизма и граничных условий действует следующее: поскольку emplace изменяет состояние экземпляра Variant, конкурентный вызов без внешней синхронизации, вероятно, не является потокобезопасным. Интерпретация: перед конструированием нового объекта ранее содержавшееся значение уничтожается, что соответствует общему поведению [variant]. Вопрос Q-548c84cc1d327030 (открытый)
При взаимодействии с родственными интерфейсами функция образует аналог на основе типа для перегрузки без списка инициализации [SWS_CORE_01661], а также для альтернатив на основе индекса [SWS_CORE_01663] и [SWS_CORE_01664]. Похожие концепции интерфейсов встречаются у ara::core::Optional[SWS_CORE_01120], а также у контейнеров, таких как ara::core::Vector[SWS_CORE_01366] или ara::core::Map[SWS_CORE_01458], причем контейнерные операции emplace в отличие от этой не являются безопасными относительно исключений.
Данное указание по использованию создано автоматически на основе данных спецификации AUTOSAR R25-11.
template <std::size_t I, typename... Args> variant_alternative_t< I, Variant< Types... > > & emplace (Args &&... args) noexcept({<cond-noexcept-11>});
As per corresponding usage in [variant] except for the following deviations: 1. Function is conditionally noexcept
СОЗДАНО ИИне провереноМодель: gemini-3.8-flash-medium · Усилие: medium · Температура: не регулируется · Промпт: f8cbed1f17b1ПроисхождениеОткрытые вопросы (1)
переведено с немецкого руководстваgemini-3.8-flash-low · 2026-10-13 · Немецкий оригинал
Использование
Функция-член emplace класса ara::core::Variant ([SWS_CORE_01663]) из заголовочного файла ara/core/variant.h служит для прямого конструирования альтернативы, определяемой шаблонным индексом I, в существующей памяти объекта. В качестве параметров передаются аргументы Args&&... args. Вызов выполняется синхронно и возвращает ссылку на вновь созданное значение типа variant_alternative_t<I, Variant<Types...>> ([SWS_CORE_01663]). Поведение определяется согласно определению в [variant] ([SWS_CORE_01663]).
Обработка ошибок и безопасность исключений
Спецификация определяет в качестве отклонения от стандарта C++ условное предложение noexcept({<cond-noexcept-11>}), а также свойство conditionally exception safe ([SWS_CORE_01663]). Вероятно, возникновение исключений зависит от того, является ли конструктор целевой альтернативы для передаваемых типов Args... безопасным относительно исключений. Вопрос Q-189fe417e9ef4980 (открытый) Специфические коды ошибок, возвращаемые значения в случае ошибки или уведомления в DET или DEM для этой функции не специфицированы.
Взаимодействие и альтернативы
Внутри модуля core и типа ara::core::Variant функция встроена в систему других перегрузок:
Инициализация на основе индекса с std::initializer_list в [SWS_CORE_01664].
Создание альтернативы на основе типа по имени типа T с помощью [SWS_CORE_01661] или в сочетании с std::initializer_list через [SWS_CORE_01662].
template <std::size_t I, typename U, typename... Args> variant_alternative_t< I, Variant< Types... > > & emplace (std::initializer_list< U > il, Args &&... args) noexcept( {<cond-noexcept-12>});
As per corresponding usage in [variant] except for the following deviations: 1. Function is conditionally noexcept
СОЗДАНО ИИне провереноМодель: gemini-3.8-flash-medium · Усилие: medium · Температура: не регулируется · Промпт: a600ca3cb60dПроисхождениеОткрытые вопросы (1)
переведено с немецкого руководстваgemini-3.8-flash-low · 2026-10-13 · Немецкий оригинал
Функция-член emplace из ara/core/variant.h синхронно конструирует новое значение альтернативы непосредственно на месте внутри существующего экземпляра ara::core::Variant[SWS_CORE_01664]. Целевой тип при этом жестко определяется через шаблонный индекс I. Вызов принимает список инициализации il типа std::initializer_list<U>, а также необязательные аргументы args и возвращает ссылку на вновь созданное значение типа variant_alternative_t<I, Variant<Types...>>&[SWS_CORE_01664].
Для обработки ошибок операция классифицирована как условно безопасная относительно исключений (conditionally exception safe) и снабжена условным noexcept[SWS_CORE_01664]. Вычисление условия {<cond-noexcept-12>}, вероятно, зависит от того, не генерирует ли конструктор целевого типа с il и args исключений. Вопрос Q-87f90253fc61c883 (открытый) Специфические коды ошибок, а также сообщения в DET или DEM в спецификации не определены; поведение при исключениях, за исключением объявления noexcept, следует стандартному поведению [variant][SWS_CORE_01664].
СОЗДАНО ИИне провереноМодель: gemini-3.8-flash-medium · Усилие: medium · Температура: не регулируется · Промпт: fb0fc41b4094ПроисхождениеОткрытые вопросы (1)
переведено с немецкого руководстваgemini-3.8-flash-low · 2026-10-13 · Немецкий оригинал
Функция-член index класса ara::core::Variant служит для синхронного запроса отсчитываемого от нуля индекса текущего удерживаемого типа согласно спецификации [SWS_CORE_01665]. Она ведет себя аналогично соответствующему использованию в стандартном типе C++ std::variant («As per corresponding usage in [variant]»), не принимает параметров и возвращает текущий индекс как std::size_t. Объявлена она в заголовочном файле ara/core/variant.h и квалифицирована как constexpr, а также noexcept.
В отношении обработки ошибок и безопасности исключений метод специфицирован как exception safe[SWS_CORE_01665]. Поскольку он объявлен как noexcept, сам он не генерирует исключений и не вызывает условий ошибок. Вызывающие стороны могут анализировать возвращенный индекс, чтобы перед доступом к альтернативным значениям убедиться, какой тип активен в ara::core::Variant.
Во взаимодействии с типизированными функциями доступа ara::core::get метод index играет ключевую роль: перегрузки get для lvalue и rvalue явно проверяют условие variant.index() != I согласно [SWS_CORE_01613], [SWS_CORE_01614], [SWS_CORE_01615] и [SWS_CORE_01616]. Если индекс не совпадает с запрошенным позиционным индексом I, в отличие от std::bad_variant_access инициируется нарушение IsoStdBadVariantAccessViolation. Предварительное согласование с помощью index() предотвращает этот ошибочный доступ во время выполнения.
Что касается параллелизма, этот метод как операция const безопасен для параллельного доступа на чтение к одному и тому же variant до тех пор, пока отсутствуют конкурирующие модификации; внутренняя синхронизация против параллельных операций записи, предположительно, отсутствует. Вопрос Q-12e0dad0a6b8c5d0 (открытый)
Этот текст был сгенерирован ИИ на основе спецификации AUTOSAR R25-11.
СОЗДАНО ИИне провереноМодель: gemini-3.8-flash-medium · Усилие: medium · Температура: не регулируется · Промпт: 015c4319d2b5ПроисхождениеОткрытые вопросы (2)
переведено с немецкого руководстваgemini-3.8-flash-low · 2026-10-13 · Немецкий оригинал
Использование
Функция-член valueless_by_exception класса ara::core::Variant предоставляется в модуле core через заголовочный файл #include "ara/core/variant.h" ([SWS_CORE_01666]). В соответствии со своей сигнатурой constexpr bool valueless_by_exception () const noexcept; она не требует параметров вызова и синхронно возвращает логическое значение ([SWS_CORE_01666]). Функциональное значение определяется общепринятой семантикой [variant] («As per corresponding usage in [variant]») ([SWS_CORE_01666]). Интерпретация: возвращаемый статус true, вероятно, сигнализирует вызывающей стороне о том, что предыдущее присваивание значения или изменение типа было прервано из-за возникновения исключения, и поэтому объект Variant временно не представляет допустимого состояния. Вопрос Q-af7c00c7eb4ef5a1 (открытый)
Обработка ошибок и безопасность исключений
Что касается поведения при ошибках, метод объявлен как noexcept и формально классифицирован как exception safe ([SWS_CORE_01666]). Собственный случай ошибки при опросе отсутствует; функция не генерирует C++-исключений ([SWS_CORE_01666]). Специфические коды ошибок, описания ответов или сообщения диагностическим инстанциям и службам мониторинга ошибок, таким как DET или DEM, для этого элемента не определены ([SWS_CORE_01666]).
Параллелизм и ограничения
Поскольку valueless_by_exception специфицирован как метод const и constexpr, во время выполнения никаких модифицирующих обращений к внутреннему состоянию объекта не происходит ([SWS_CORE_01666]). Интерпретация: одновременные запросы на чтение одного и того же экземпляра из нескольких потоков, по всей видимости, могут безопасно выполняться без отдельной синхронизации, пока исключены конкурирующие операции записи. Вопрос Q-5c28f8cef1c1f097 (открытый)
Данное указание по использованию сгенерировано автоматически на основе AUTOSAR R25-11.
gemini-3.8-flash-low· 2026-10-13 · Немецкий оригинал