为什么Fortran指针总是可变的

PVi*_*itt 2 fortran pointers constants

我刚刚开始在Fortran中使用指针,最近偶然发现,Fortran中的指针不能保持不变.这意味着,这样的事情是不可能的:

procedure(proc_type), pointer, parameter :: fPtr => myFunc
Run Code Online (Sandbox Code Playgroud)

我试图找出为什么这是不可能的原因.但我发现的唯一一件事就是"现代Fortran解释":

另请注意,常量可能不是指针[..],因为它们始终是变量.

但这并不能解释背后的原因.有谁知道这个?

Vla*_*r F 5

因为Fortran规则是这样说的

Fortran 2008(ISO/IEC 1539-1:2010):

5.3.14 POINTER属性

1具有POINTER属性的实体可以在执行程序期间与不同的数据对象或过程相关联.指针是数据指针或过程指针.过程指针在12.4.3.6中描述.

这与常量不兼容.

为什么规则如此?因为标准的作者就这样做了.

为什么他们这样做?对此的答案通常非常简单 - 因为没有人提出不同的规则需要委员会讨论和批准,或者委员会的一些成员不喜欢它.你真的要问他们 - J3SC22/WG5,但要准备好答案,没有具体原因.

在某些属于同一类别的语言中,例如C和C++,常量指针是可能的.初始化的常量指针指向整数常量

const int i = 3;
static int* const x=(int*)&i;
Run Code Online (Sandbox Code Playgroud)

一个常量指针初始化为指向整数函数

int fun(){
  return 1;
}

static int (* const x)()=&fun;
Run Code Online (Sandbox Code Playgroud)

绝对有可能在Fortran中允许这样的东西.请联系Fortran标准委员会的代表,以建议这样的功能.

如IanH和credondo所示,有一些方法可以绕过这种限制,但是这个答案试图让我保持原始问题的界限.为何存在此限制?