Автоматическое перераспределение LHS с перегрузкой
У меня есть код, который не работает со всеми имеющимися у меня компиляторами при выполнении присваивания нераспределенному, выделяемому на LHS с конструктором структуры на RHS. Сама структура (производный тип) имеет перегруженное назначение. Я думал, что автоматическое перераспределение LHS должно произойти до того, как будет вызвана процедура присваивания, но, похоже, это не так.
Ниже приведен код, демонстрирующий проблему. Раскомментирование оператора alloc делает все работающим, но я не понимаю, почему в этом случае необходимо явное распределение. Забавно, если я уберу перегруженное задание, все будет работать.
Есть намеки?
module dummy
implicit none
type :: DummyType
integer :: ii
contains
procedure :: assignDummyType
generic :: assignment(=) => assignDummyType
end type DummyType
interface DummyType
module procedure DummyType_init
end interface DummyType
contains
function DummyType_init(initValue) result(this)
integer, intent(in) :: initValue
type(DummyType) :: this
this%ii = initValue
end function DummyType_init
subroutine assignDummyType(this, other)
class(DummyType), intent(out) :: this
type(DummyType), intent(in) :: other
this%ii = other%ii + 1
end subroutine assignDummyType
end module dummy
program test_dummy
use dummy
implicit none
type(DummyType), allocatable :: aa
!allocate(aa) ! Should be covered via automatic reallocation...
aa = DummyType(42)
end program test_dummy
1 ответ
В последнее время на comp.lang.fortran обсуждается эта тема.
Оператор присваивания является либо внутренним присваиванием, либо заданным присваиванием. Внутреннее назначение допускает [пере] распределение левой стороны, а определенное назначение - нет.
Когда вы предоставляете процедуру для общего идентификатора присвоения, ваше назначение является заданным назначением. Характеристики аргумента, соответствующие левой части, требуют, чтобы левая часть была выделена.