Как эта чистая функция может изменять неприватное состояние?

TDPL, стр. 167:

пока изменяемое состояние в функции полностью транзитивно (т.е. выделено на стеке) и приватно (т.е. не передается по ссылке функциям, которые могут его испортить), функция может считаться чистой.

import std.stdio : writeln;

struct M{
  int[4] _data;

  pure ref int opIndex(size_t i){ return _data[i]; }
}

pure M foo(ref M m){

  m[0] = 1234;
  return m;
}

void main(){

  M m1 = M([7, 7, 7, 7]);

  writeln(m1);
  foo(m1);
  writeln(m1);
}

// output:
// M([7, 7, 7, 7])
// M([1234, 7, 7, 7])

Мутабельное состояние является транзитивным, потому что оно находится в стеке, верно? Но оно не является приватным. Так как же foo() может модифицировать m1?

5
задан Richard JP Le Guen 14 March 2013 в 02:56
поделиться