3

この質問は、署名の制約に関する私の質問に対する Andrei の回答に基づいています。

struct S(int x, int y) {
  void fun(T)(T t) if (is(T U == S!(a, b), int a, int b)) { }
}

template s(int a, int b) {
  enum result = S!(a,b)();
  alias result s;
}

void main() {

  auto s1 = S!(1, 1)();
  auto s2 = S!(2, 2)();
  auto s3 = s!(3, 3);
  auto s4 = s!(4, 4);

  s1.fun(s1);  // ok
  s1.fun(s2);  // ok
  s1.fun(s3);  // compile error
  s3.fun(s1);  // ok
  s3.fun(s3);  // compile error
  s3.fun(s4);  // compile error
}

コードでコンパイル エラーが発生する理由がわかりません。何か案は?

4

1 に答える 1

3

まず、ネイキッド テンプレートを使用してオブジェクト/構造体のインスタンスを生成することはお勧めしません。これは、オブジェクトが CTFE 対応である必要があるためです。returnインスタンスが必要な場合は、テンプレート化された関数からインスタンスを取得するのが最善の方法です。

@property S!(a, b) s(int a, int b)()
{
    return S!(a, b)();
}

ただし、これはまだテンプレートの制約では機能しないようです。これはフロントエンドのバグに違いないと思います。私が知る限り、返された型は is() 式で適切にチェックできないようです。

struct S(int x, int y) 
{
    void fun(T)(T t) 
        if (is(T U == S!(a, b), int a, int b))
    {

    }
}

@property S!(a, b) s(int a, int b)()
{
    return S!(a, b)();
}

void main() 
{
    auto s1 = S!(1, 1)();
    auto s2 = S!(2, 2)();  // comment out and you get errors in fun() call
    auto s3 = s!(2, 2);
    s1.fun(s3);
}

これをバグとして報告します。

編集: Issue 8493として提出。

于 2012-08-02T14:40:46.033 に答える