具有私有组件的结构构造器

Structure constructor with private component

我在以下示例中定义了一个包含私有组件的结构:

module mtypes
    implicit none

    type mytype
        integer, private :: nr
    end type

end module mtypes

program main

    use mtypes
    type(mytype) :: t1

    t1 = mytype(1)
    print *, t1

end program main

以 1 作为参数调用结构构造函数。据我了解,这应该是不可能的,因为 nr 是私有的。但是,这是由 Intel(R) Visual Fortran Compiler XE 14.0.5.239 [IA-32] 编译的,而不是 gfortran 4.9.3 使用 cygwin 编译的。此外,print 语句在输出中显示了 nr 的值。 Fortran 以这种方式使用最新标准定义具有私有组件的结构是否有效?或者这是intel编译器的bug?

在Fortran 2008的草案中,4.5.10中详细介绍了隐式(即派生类型定义而来的)结构构造函数。给定的一个约束是

The type name and all components of the type for which a component-spec appears shall be accessible in the scoping unit containing the structure constructor.

由于组件 nr 在主程序中不可访问,因此将 nr 作为组件规范违反了此约束。在模块中使用此隐式结构构造函数会很好,私有组件具有默认初始化也是如此。

nagfor 也因此抱怨您的代码示例。

print 声明中,这显然是无效的,ifort 15 对此进行了抱怨。要使 t1 出现在输出列表中,您必须使用定义输出过程。