人は死んだらどこへ行くの?

というお題をC++臭い疑似言語で考えてみる。

struct Spirit;
struct Body;

どこまで精神かってのはあるだろうけど、肉体以外全てということで。

struct Spirit{
  gender, age, name, location;
};

struct Body: RealObject{
  Spirit spirit;

  moveto();
};

で、ここでdelete bodyすると、location含むspiritは消滅します。おしまい。
  
これC#なんかでやると、BodyがGCに回収されてもSpiritが他から参照されていれば回収されないのよね。参照されなくなったらSpiritも消えるってのは、魂は知人の中で生き続けるとか、忘れられたら実質存在しないって話に通ずるところが。バイトでウィザードに存在を消す術があったけど、あれはその人に関連する他人の記憶を消し去る*1灼眼のシャナではトーチにされると徐々に存在の力が弱まるが、これは徐々に気にされなくなり、忘れられていく*2
ところで「他人の中で生き続ける」となるともはや空想上の存在になるわけだけど、考えて見ればしばらく会ってない人、会ったことない人、極端に言えば他人のイメージ全てある意味空想上の存在のような。その証拠に同じ人を指していても人それぞれイメージが違う。というところから考えた別解。

union SpiritRef{
  const Spirit *real; //目の前にいるときだけアクセス可能
  Spirit localcopy;
}

会っていないときはlocalcopyの方に間接的に得た情報を蓄積して、localcopyの情報を参照する。実際にあったときだけrealが――もっともパブリックメンバなんて知れてるだろうが――参照可能になる。なんだかオフラインフォルダとかレプリケーションの同期みたいだ。この考え方だと、realの参照先が存在しているかではなくて、参照可能かどうかに意味がある。realが消滅していたら永遠に同期できないだけの話だ。そしてrealが元からぬるぽである空想上の人物同様に、全ては想像によって更新される。と、なれば。ref(.localcopy).locationに天国を代入するのも地獄を代入するのも、おのおのの勝手というわけだ。
で、たどりついた結論は「オリジナルは消滅するから所在地なんてないが、他人が持つイメージの所在地はご自由に」。
  
肉体の死を知ったとき、spiritへの参照を破棄することもできる。つまり、忘れること。でも忘れたくない。だから破棄しない。
locationに実際の地名が入ってるとややこしいし、nullにすると消えてしまいそうだし・・・天国/地獄でも入れておきますか。

*1:肉体がどうなったかは忘れた

*2:だったはず