Автоматическое перераспределение LHS с перегрузкой

У меня есть код, который не работает со всеми имеющимися у меня компиляторами при выполнении присваивания нераспределенному, выделяемому на LHS с конструктором структуры на RHS. Сама структура (производный тип) имеет перегруженное назначение. Я думал, что автоматическое перераспределение LHS должно произойти до того, как будет вызвана процедура присваивания, но, похоже, это не так.

Ниже приведен код, демонстрирующий проблему. Раскомментирование оператора alloc делает все работающим, но я не понимаю, почему в этом случае необходимо явное распределение. Забавно, если я уберу перегруженное задание, все будет работать.

Есть намеки?

module dummy
  implicit none

  type :: DummyType
    integer :: ii
  contains
    procedure :: assignDummyType
    generic :: assignment(=) => assignDummyType
  end type DummyType

  interface DummyType
    module procedure DummyType_init
  end interface DummyType

contains

  function DummyType_init(initValue) result(this)
    integer, intent(in) :: initValue
    type(DummyType) :: this
    this%ii = initValue
  end function DummyType_init

  subroutine assignDummyType(this, other)
    class(DummyType), intent(out) :: this
    type(DummyType), intent(in) :: other
    this%ii = other%ii + 1
  end subroutine assignDummyType
end module dummy

program test_dummy
  use dummy
  implicit none

  type(DummyType), allocatable :: aa

  !allocate(aa)   ! Should be covered via automatic reallocation...
  aa = DummyType(42)

end program test_dummy

1 ответ

Решение

В последнее время на comp.lang.fortran обсуждается эта тема.

Оператор присваивания является либо внутренним присваиванием, либо заданным присваиванием. Внутреннее назначение допускает [пере] распределение левой стороны, а определенное назначение - нет.

Когда вы предоставляете процедуру для общего идентификатора присвоения, ваше назначение является заданным назначением. Характеристики аргумента, соответствующие левой части, требуют, чтобы левая часть была выделена.

Другие вопросы по тегам