てなことを

考えながら
http://blogs.wankuma.com/rti/archive/2007/12/27/114850.aspx
を読んでみると、

// (a)
double amount = this.GetAmount();
this.SetAmount(amount);

// (b)
var amount = this.GetAmount();
this.SetAmount(amount);

// (c)
this.SetAmount(this.GetAmount());

は3つとも「書き手がそのコードを書いているときの意図」が違うよね、って話になるかと思います。

  • (a)の場合、書き手はamountという「double型の変数を用意したい」のだし、
  • (b)の場合、書き手はamountという「GetAmount()の戻り値を受ける変数を用意したい」のだし、
  • (c)の場合、書き手は「GetAmound()の戻り値をSetAmount()に渡したい」のであって、

それ以上でも以下でもないはずです。
書き手がまったく異なる文脈で書いたコードを三つ並べて「(読み手から見て)意味は同じだ」と論じたところで、自動型推論に関する議論として導ける答えは
「これまでは上手く書くのが難しかった(b)が簡単に書けるようになったよ!」
という当たり前のことでしかないのではないかと。
http://d.hatena.ne.jp/faith_and_brave/20071225/1198582400
で言う「C++で受け入れられやすい」のはまさに(b)の意図のための構文がほしくてほしくてたまらなかったからなわけで。


誤解しないで頂きたいのは、ここで問題にしているのは「書き手の意図が分かるか否か」ではないということです。そんなの周りのコードを見れば分かることですからね。
なので
http://d.hatena.ne.jp/NyaRuRu/20071125/p1

「可読性」ってそんなに以心伝心できるもんですかね?

という部分はとても賛同できます。
#結論は違うけど


…てなことを書こうとしてたらεπιστημη師匠の
http://blogs.wankuma.com/episteme/archive/2007/12/27/114856.aspx

var children = new List<Child>();
僕はおそらく、このテの(省略目的の)varは使わない気がします。
childrenはList<Child>でなくてはならないとは思っていない、
Childの集合でありさえすればえぇのや、
ICollection<Child> children = new List<Child>();
なのよね僕のキモチ的には。

そうそう、それですよね。「僕のキモチ」=「書き手の意図」。


επιさんの例は動的な例ですが、C++使いとしては静的な例もなんぞ考えねばいかんぞいね…と思ったけど上手く書けないな(めっちゃ苦しいコードになる)。

auto Collection<Child>* children = new std::list<Child>();

とか書けるようになればいいんだけどなあ…。


#…以上、現実逃避モード終わり。しくしく。