Dwarf Standing on the Shoulders of Giants

If I have seen further it is only by standing on the shoulders of giants. by Issac Newton

2009年11月19日

(int)

例えば、1/2が0として(意に反して)認識されるというバグはよく埋め込まれる。今日ちょうどこれで数週間悩んでいたのが発覚して、あまりの呆気なさに愕然とした。指摘されればすぐ気づくバグではあるが、なかなか自分では気づかないのが悲しい。

ところが、これも同じく今日気づいたのだが(これで悩んだのは数十分)、こちらはどう考えても言語設計が悪いだろうという罠。


container<double> x; // 0 <= x[i] < 1
std::cout << std::accumulate(
 x.begin(),
 x.end(),
 0,
 std::plus<double>()
) << std::endl;
// prints 0.

期待した結果が欲しければ、以下のようにせねばならない。


std::accumulate(
 x.begin(),
 x.end(),
 0.0,
 std::plus<double>()
)

そう、std::accumulateは第3引数で型を推論しているので、第4引数にどんな関数オブジェクトを指定しても出力は第3引数の型となる。これは非常に厄介だ。まあ、実装する側になって考えれば、この罠を回避するうまい術は思いつかないのだが。

ラベル:

0 件のコメント:

コメントを投稿

この投稿へのリンク:

リンクを作成

<< ホーム