我试图理解为什么标准允许下面的一个而另一个不允许。除了样板代码,它们似乎没有什么不同。我觉得我误解了某些东西,或者说有更好的方法。任何帮助,将不胜感激。
不允许:
real :: x
class(*) :: temp
x = 4
temp = genericAssignment(x)
select type(temp)
type is(real)
write(*,*) temp
end select
contains
function genericAssignment(a) result(b)
class(*) :: a
class(*) :: b
allocate(b, source=a)
end function genericAssignment
允许:
Type GenericContainer
class(*), pointer :: gen
End Type
real :: x
class(*) :: ptr
type(GenericContainer) :: temp
x = 4
temp = genericAssignment(x)
select type(ptr => temp%gen)
type is(real)
write(*,*) ptr
end select
contains
function genericAssignment(a) result(b)
class(*) :: a
type(GenericContainer) :: b
allocate(b%gen, source=a)
end function genericAssignment
答案 0 :(得分:1)
目前的标准允许两者。
“允许”代码块具有非多态结果的函数,其结果是将函数评估为非多态变量。这是有效的Fortran 2003。
“不允许”块具有带有多态结果的函数,其结果是评估将函数分配给多态变量。这是有效的Fortran 2008。
请注意,那里完整的Fortran 2008编译器实现的数量很少。
~~~
“不允许”块中的函数有点无意义 - 代码块相当于:
real :: x
class(*) :: temp
x = 4
temp = x
select type(temp)
type is(real)
write(*,*) temp
end select