具有重载分配的自动LHS重新分配

时间:2015-09-08 08:02:02

标签: fortran fortran2003 fortran2008

我有一个代码,当我在RHS上使用结构构造函数对LHS上的未分配的可分配项进行赋值时,它与我手头的所有编译器进行了段错误。结构(派生类型)本身具有重载的赋值。我想,LHS的自动重新分配应该在调用赋值例程之前发生,但似乎并非如此。

在代码下方,演示问题。取消注释allocate语句会使一切正常,但我不明白,为什么在这种情况下需要显式分配。有趣的是,如果我删除重载的任务,事情也会起作用。

任何提示?

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 个答案:

答案 0 :(得分:4)

recent discussion on comp.lang.fortran处理此主题。

赋值语句是内部赋值或已定义的赋值。内在赋值允许[重新]分配左侧,定义的赋值不允许。

当您为分配通用标识符提供过程时,您的分配是已定义的分配。然后,与左侧相对应的参数的特征需要分配左侧。