私のDプログラムには、これに絞り込んだかなり奇妙な動作があります。
import std.algorithm;
import std.stdio;
import std.traits;
enum E { a, b, c };
struct S { E e; };
void main()
{
immutable(S)[] source = [ S(E.a), S(E.a), S(E.b) ];
foreach (e; EnumMembers!E)
{
size_t c = count!(x => x.e == e)(source);
writeln(e, " -> ", c);
}
}
このプログラムの出力は、次のようなものになると思います。
a -> 2
b -> 1
c -> 0
しかし、実際の結果は次のとおりです。
a -> 2
b -> 2
c -> 2
不思議なことに、forループを変更してforeach (e; [ E.a, E.b, E.c ])
、期待どおりの出力を生成します。を使用foreach (e; [ EnumMembers!E ])
すると期待どおりの結果が得られるので、ここでの範囲の使用がEnumMemebers
問題であることは明らかです...理由はわかりません。
私は明らかに何か間違ったことをしているのですが、何がわからないので、洞察をいただければ幸いです。
私のコンパイラはDMD64 D Compiler v2.059
Linux上にあります。
編集:これはGDC 4.6.3とまったく同じ動作をするため、コンパイラのバグではありません。
編集:count
呼び出しを別の関数に移動することによって:
size_t counte(Range)(E e, Range src)
{
return count!(x => x.e == e)(src);
}
c
の初期化をに変更するsize_t c = counte(e, source);
と、プログラムは期待どおりに動作します。