Конструктор структуры с приватным компонентом

Я определил структуру с частным компонентом в следующем примере:

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?

1 ответ

Решение

В проекте Fortran 2008 конструкторы неявных (то есть тех, которые получены из определения производного типа) подробно описаны в 4.5.10. Есть одно ограничение:

Имя типа и все компоненты типа, для которого появляется спецификация компонента, должны быть доступны в области видимости, содержащей конструктор структуры.

Как компонент nr недоступно в основной программе, это ограничение нарушается nr как компонент-спец. Было бы хорошо использовать этот неявный конструктор структуры в модуле, как если бы он имел инициализацию по умолчанию для частного компонента.

По этой причине nagfor также жалуется на ваш пример кода.

На print Заявление, это явно недействительно, и ifort 15 жалуется на это. За t1 чтобы появиться в списке вывода, вы должны использовать определенную процедуру вывода.

Другие вопросы по тегам