Fortran 具有重载分配的LHS自动再分配
我有一个代码,当在LHS上使用RHS上的结构构造函数对未分配的可分配对象进行赋值时,它会将我手头的所有编译器都划分为错误。结构(派生类型)本身具有重载赋值。我认为,LHS的自动重新分配应该在调用赋值例程之前发生,但事实似乎并非如此 下面是代码,演示问题。取消对allocate语句的注释可以使一切正常工作,但我不理解为什么在这种情况下需要显式分配。有趣的是,如果我删除超负荷的任务,事情也会顺利进行 有什么提示吗Fortran 具有重载分配的LHS自动再分配,fortran,fortran2003,fortran2008,Fortran,Fortran2003,Fortran2008,我有一个代码,当在LHS上使用RHS上的结构构造函数对未分配的可分配对象进行赋值时,它会将我手头的所有编译器都划分为错误。结构(派生类型)本身具有重载赋值。我认为,LHS的自动重新分配应该在调用赋值例程之前发生,但事实似乎并非如此 下面是代码,演示问题。取消对allocate语句的注释可以使一切正常工作,但我不理解为什么在这种情况下需要显式分配。有趣的是,如果我删除超负荷的任务,事情也会顺利进行 有什么提示吗 module dummy implicit none type :: Dum
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
关于这个话题,有一个很好的解释
赋值语句可以是内在赋值,也可以是定义的赋值。内部分配允许[重新]分配左侧,但定义的分配不允许
当您提供分配通用标识符的过程时,您的分配被定义为分配。与左手边相对应的参数的特征要求分配左手边。没有查看代码,但是您有什么版本的编译器?其中一些包括了自动重新分配,有点晚了。最近的是GNU、Intel和NAG。但很明显,这似乎是标准的问题,而不是编译器的问题,正如下面IanH所解释的。如果你能添加一个链接,那就太好了。@IanH哦,我明白了,谢谢!这意味着,如果使用库提供的类型,如果希望将该类型分配给一个可分配类型而不显式分配,则必须了解该类型的实际实现(无论该分配是否被重写)。我不觉得这很直观。。。我也很感激,如果您可以提供关于COMP.Lang.FoTrand的讨论的链接。那么,为了您的库的用户,考虑在其他类型的客户端中需要定义的赋值的包装类型。