Pointers fortran中的重载箭头运算符(>;)

Pointers fortran中的重载箭头运算符(>;),pointers,fortran,operator-overloading,overloading,Pointers,Fortran,Operator Overloading,Overloading,我刚开始在Fortran 2003中重载运算符(包括赋值),我想为我的用户定义类型重载箭头运算符(=>)。 我知道大多数操作符,比如(+),我会说 interface operator(+) ! What I want this to mean instead end interface operator interface assignment(=) ! What I want this to mean instead end interface assign

我刚开始在Fortran 2003中重载运算符(包括赋值),我想为我的用户定义类型重载箭头运算符(=>)。 我知道大多数操作符,比如(+),我会说

interface operator(+)  
    ! What I want this to mean instead  
end interface operator
interface assignment(=)  
    ! What I want this to mean instead  
end interface assignment
但是,这对(=>)不起作用。我会说,我知道这是一项任务

interface operator(+)  
    ! What I want this to mean instead  
end interface operator
interface assignment(=)  
    ! What I want this to mean instead  
end interface assignment
这对(=>)仍然不起作用

具体来说,我定义了一种类型,其中底层数据是指针

type my_type
    integer, pointer :: data(:)
end type my_type
所以,当我说

type (my_type) :: a
integer, target :: b(4)

! Do stuff to b
a => b
我想这是指

a%data => b

谢谢你的建议!使用2003标准以外的标准进行解答也会有所帮助。

在Fortran 2018中,不可能重载指针赋值

询问如何使用类型绑定过程来处理重载,但在更一般的意义上,答案仍然是否定的

截至Fortran 2018,指针赋值语句的含义

a => b
始终影响左侧指针
a
的指针状态


尽管Fortran标准具有内在的和定义的赋值(后者是通过
接口赋值(=)
引入的),但指针赋值没有这种区别。

谢天谢地,您似乎不能随心所欲。在上面的示例中,如果声明是
类型(my_类型),指针::a
,该怎么办。
a=>b
是什么意思?这是语法错误吗?请注意
=>
。这里的问题包括
=
不是运算符,因此值得强调的是指针赋值也不是运算符。@Steve我希望在我的评论中引用您的答案。如果您感兴趣,请参阅下面的内容。我习惯于明确地去引用C++中的指针,所以你的评论肯定帮助我更好地理解了FORTRAN。@弗朗西斯卡斯感谢你让我意识到在Fortran中没有赋值的操作符。这很有道理,为什么我不能做链分配,因为它们不返回任何东西。那么,你是说这在2018标准中可用,还是仍然不可用?这对我来说似乎有点不清楚。如果是这样,请继续阅读:@Steve对我的问题的回答提到了编译器如何不太知道如何处理这个问题,这让我意识到,如果没有指针的显式解引用操作符,这是没有意义的。如果我有
type(my_type),那么指针::a
然后说
a=>b
,是
a
修改为指针,还是修改了底层对象?(我承认我是一个C++用户,我很抱歉,如果我的FORTRAN词汇看起来是错误的。)只是一个评论,因为你来自C++背景:指针是Fortran的最后一招,你通常用其他方法来达到目的。这与C语言家族大不相同。因此,如果你说出你真正想做的事情,我们可能会看到一种更为Fortran的方法。@madoflancashire,在Fortran中,当指针出现在某个地方时,通常使用指针的目标(即,指针通常被取消引用)。使用像
a=>b
这样的指针赋值,指针
a
的指针关联将发生更改。稍后的参考资料,如
A%x
,将是
b%x
。请听伊恩·布什的建议。Fortran指针与C/C++指针不同。Fortran指针在语言中确实有一席之地,但如果你能避免它们,那就这样做。@IanBush我需要能够对数据进行别名,可能会对很多数据进行别名,在任何给定的时刻可能会进行3次以上的别名。一切都是固定不变的,所以我不必担心对记忆的危害。但是,我想用多重别名来节省内存,而不是直接复制。因此,我想到了指针,因为我可以随意分配它们。我调用的函数不是一个矩阵,而是一个数组数组,因为我想分别对每个子数组进行别名。