【D言語】dmdのバグ【Issue 9169】
D言語erの皆さん、こんにちは。
今回は、ついこの前、間接的に(?)ぶつかったバグである、Issue 9169を軽く紹介していきます。 あまり関係ないですが、もうバグ報告数が9000を超えたんですね・・・
バグの内容
テンプレート構造体を作る際、わざわざテンプレート引数を入力するのが面倒くさい場合があります。
struct Hoge(T, U, V){
T a;
U b;
V c;
}
void main(){
auto hoge = Hoge!(int, double, string)(10, 3.14, "hoge");
}
引数からテンプレート構造体のテンプレート引数を推論してくれると嬉しいですね。 そんな時、Hogeを作るだけのテンプレート関数hogeをよく作ります。
struct Hoge(T, U, V){
T a;
U b;
V c;
}
Hoge!(T, U, V) hoge(T, U, V)(T a, U b, V c){
return Hoge!(T, U, V)(a, b, c);
}
void main(){
auto hoge = hoge(10, 3.14, "hoge");
}
推論が効いてていい感じですね。
こんな時、以下のように書いてしまうと・・・
class C{
Hoge!(int, double, string) hoge = hoge(10, 3.14, "hoge");
}
以下のようなコンパイルエラーが出てしまいます。
Error: struct Hoge does not overload ()
なぜ?
バグレポートによると、上の場合、右辺のhogeは関数ではなく、Cのhogeそれ自身を指していると意味解析されてしまいます。
一見わかりづらいエラーメッセージも、そう考えると辻褄が合いますね。
まとめ
Issue 9169を軽く紹介していきました。 とは言っても、このバグでつまずく人は少ないかもしれませんね・・・
担当:美馬(関数の名前を、makeHogeとかに変えれば簡単に回避できる・・・)