在C ++中,各种选项都可以将参数传递给函数(通过值传递,引用,指针,对const的引用,指向const的指针,......)。 我想知道Fortran模拟对于所有这些选项会是什么。这种类比从概念的角度来看,而不是互操作性的观点。
据我所知,Fortran通过引用传递其参数,但此规则有一些例外(非连续数组)。考虑到这一点,以下转换是否正确,或者是否有更好的属性可以给出?
void f(X x); // Pass by value
这只是传递的原始值的副本
SUBROUTINE f(x)
TYPE(X), VALUE :: x
...
END SUBROUTINE f
void f(X &x); // Pass by reference
此处x
是其值已更新的引用。由于引用传递是Fortran中的“默认”,我看到剩下两种可能的选项:参数INTENT(OUT)
或INTENT(INOUT)
SUBROUTINE f(x)
TYPE(X), INTENT([IN]OUT) :: x
...
END SUBROUTINE f
void f(X const &x); // Pass by reference-to-const
此处x
是无法更新其值的参考。
SUBROUTINE f(x)
TYPE(X), INTENT(IN) :: x
...
END SUBROUTINE f
void f(X *p); // Pass by pointer
这只是传递指针的副本。但是,这意味着应该合并属性POINTER
和VALUE
,但Fortran中不允许这样做。我能想象的唯一选择是
SUBROUTINE f(x)
TYPE(X), INTENT(INOUT) :: x
TYPE(X), POINTER :: p => x
...
END SUBROUTINE f
void f(X const *p); // Pass by pointer-to-const
这里p
是指向复制的const的指针。但是,这与f(X *p)
SUBROUTINE f(x)
TYPE(X), INTENT(IN) :: x
TYPE(X), POINTER :: p => x
...
END SUBROUTINE f
void f(X * const p); // Pass by const-pointer
此处p
是一个无法更改的指针,但它指向的对象可以。同样p
是副本而不是参考
SUBROUTINE f(x)
TYPE(X), INTENT(INOUT) :: x
TYPE(X), POINTER, PARAMETER :: p => x
...
END SUBROUTINE f
void f(X const * const p); // Pass by const-pointer
这里p
是一个无法改变的指针,它指向的对象也不能改变。同样p
是副本而不是参考
SUBROUTINE f(x)
TYPE(X), INTENT(IN) :: x
TYPE(X), POINTER, PARAMETER :: p => x
...
END SUBROUTINE f
void f(X * & p); // Pass by reference-to-pointer
这是对指针的引用,p
及其指向的对象都可以更改。
SUBROUTINE f(p)
TYPE(X), POINTER, INTENT([IN]OUT) :: p
...
END SUBROUTINE f
void f(X const * & p); // Pass by reference-to-pointer-to-const
这里p
引用了一个指向常量对象的指针。
这里似乎没有类似的东西。
void f(X * const & p); // Pass by reference-to-const-pointer
此处p
是对指针的引用,指针无法更改,但指向的对象可以。
SUBROUTINE f(p)
TYPE(X), POINTER, INTENT(IN) :: p
...
END SUBROUTINE f
void f(X const * const & p); // Pass by reference-to-const-pointer-to-const
这里p
是对无法改变的指针的引用,它指向的对象也不能改变。这里有类似的吗?