在 C++ 中,可以通过各种选项将参数传递给函数(按值传递、引用、指针、const 引用、const 指针等)。我想知道所有这些选项的 Fortran 模拟是什么。这种模拟是从概念的角度来看的,而不是从互操作性的角度来看。
据我所知,Fortran 通过引用传递其参数,此规则有一些例外(非连续数组)。考虑到这一点,以下转换是否正确,或者是否可以给出更好的属性?
void f(X x); // Pass by value
这只是传递的原始值的副本
SUBROUTINE f(x)
TYPE(X), VALUE :: x
...
END SUBROUTINE f
Run Code Online (Sandbox Code Playgroud)void f(X &x); // Pass by reference
这x是一个引用,其值已更新。由于引用传递是 Fortran 中的“默认值”,我看到剩下两个可能的选项:参数 anINTENT(OUT)或INTENT(INOUT)
SUBROUTINE f(x)
TYPE(X), INTENT([IN]OUT) :: x
...
END SUBROUTINE f
Run Code Online (Sandbox Code Playgroud)void f(X const &x); // Pass by reference-to-const
这x是一个无法更新其值的引用。
SUBROUTINE f(x)
TYPE(X), INTENT(IN) :: x
...
END SUBROUTINE f
Run Code Online (Sandbox Code Playgroud)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
Run Code Online (Sandbox Code Playgroud)void f(X const *p); // Pass by pointer-to-const
这p是一个指向被复制的常量的指针。然而,这与使用相同的问题f(X *p)
SUBROUTINE f(x)
TYPE(X), INTENT(IN) :: x
TYPE(X), POINTER :: p => x
...
END SUBROUTINE f
Run Code Online (Sandbox Code Playgroud)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
Run Code Online (Sandbox Code Playgroud)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
Run Code Online (Sandbox Code Playgroud)void f(X * & p); // Pass by reference-to-pointer
这是对指针的引用,它p和它指向的对象都可以改变。
SUBROUTINE f(p)
TYPE(X), POINTER, INTENT([IN]OUT) :: p
...
END SUBROUTINE f
Run Code Online (Sandbox Code Playgroud)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
Run Code Online (Sandbox Code Playgroud)void f(X const * const & p); // Pass by reference-to-const-pointer-to-const
这p是对不能改变的指针的引用,它指向的对象也不能改变。这里有模拟吗?