3

Dのドキュメントから:

または、autorefパラメーターを使用して単一のテンプレート化されたopEquals関数を宣言することもできます。

bool opEquals()(auto ref S s) { ... }

<...>

構造体がopCmpメンバー関数を宣言する場合は、次の形式に従う必要があります。

int opCmp(ref const S s) const { ... }

では、なぜ次のコードはコンパイルに失敗するのですか?

import std.stdio;
import std.conv;

struct Fgs {
    int v;
    this(int iv) {
        v = iv;
    }

    bool opEquals()(auto ref Fgs another) {
        return v == another.v;
    }

    int opCmp(ref const Fgs another) const {
        if (this == another) {
            return 0;
        } else if (this.v < another.v) {
            return -1;
        } else {
            return 1;
        }
    }
}


unittest {
    auto a = Fgs(42);
    auto b = Fgs(10);
    assert(a != b);
    assert(a > b);
}

DMDの出力は次のとおりです。

/home/mfag/lighthouse/testss.d(15): Error: template testss.Fgs.opEquals does not match any function template declaration
/home/mfag/lighthouse/testss.d(10): Error: template testss.Fgs.opEquals() cannot deduce template function from argument types !()(const(Fgs))
4

1 に答える 1

5

constそれが書かれたときに考慮されていませんでした。これは機能するはずです:

bool opEquals()(auto const ref Fgs another) const

しかし、これは少し流動的な状態にある言語の領域でありauto ref、将来、非テンプレートで使用できるようになる可能性があります。

于 2012-12-26T15:11:58.333 に答える