Это ограничение LRM (см. Раздел 9.3.2 «Параллельные блоки в LRM 1800-2017»). Причина этого ограничения связана с тем, что время жизни любой переменной, указанной в fork / join_none / Блок join_any должен существовать на протяжении всего жизненного цикла блока fork. Вспомните, что существуют такие виды времени жизни переменных
- Статический - постоянный и не проблема для этой проблемы
- Автоматически - существует на время активации блока
- Динамический - управление памятью объекта класса по активным ссылкам.
Очереди, динамические массивы и ассоциативный массив добавляют другое измерение к вышеуказанному для каждого элемента.
Проблема в том, что когда вы передаете переменную по ссылке, у вас нет информации о том, к какому классу хранения относится переменная, чтобы иметь возможность продлить срок ее службы. У вас есть только ссылка на общий тип переменной, который соответствует типу ссылки.
Предположим, у вас есть задача с аргументом ref для int, и вы вызываете эту задачу, передавая ей член класса, который является int. Код, который вызывает эту задачу, только передает ссылку на этот int, а не дескриптор класса, которому он принадлежит. та же проблема с передачей элемента массива.
Если компилятор вставляет задачу (заменяя вызов задачи содержимым исходного кода задачи), вы можете обойти это ограничение. Но тогда вы не сможете воспользоваться отдельной компиляцией (компиляция определения задачи на отдельном шаге от компиляции кода, вызывающего задачу).