0
struct Type
{
  auto opBinary(string op)(Type other) const {
    return Type();         // #1 return type is Type
    return typeof(this)(); // #2 return type is const(Type)
  }
}

unittest
{
  Type t1, t2;
  auto t3 = t1 + t2;
}

t1.opBinary!("+")(t2),t1成为一个常量,而t2保持非常量。opBinary的返回类型应该是or Typeconst(Type)为什么?

const(T)是一个超类型,所以也许它应该返回 a const,但我在实践中几乎没有看到过。当处理使用这些类型或被这些类型使用的类型和函数的层次结构时,事情也会变得相当复杂。

4

2 回答 2

4

由于这里的返回值是一个新对象,我会说它是非常量的。作为新的,它可以安全地修改,所以没有理由用 const 不必要地限制它。

如果要返回现有对象的一部分,则需要使用 inout 而不是 const。inout 表示对象的 constness 也会去返回值。

inout(Type) opBinary(string op)(Type other) inout {
    return whatever;
}

现在,如果您使用 const(Type) 对象,则返回也将是 const,如果在可变对象上调用它,则返回也是可变的。

于 2013-01-25T22:40:22.960 回答
1

返回类型应该是 T 还是 const(T)?任何人都会做。

哪一个更好?取决于您的预期行为。

opBinary 上的const限定符仅表示隐藏的“this”参数是const。仅此而已,仅此而已。它并不暗示有关返回类型的任何内容。这一切都归结为非常简单的选择:

struct Type
{
    int a;
    auto opBinary(string op)(Type other) const
           if (op == "+")
    {
        return Type(this.a + other.a);
    }
}

void main()
{
    Type first, second;
    (first + second).a = 42; // Do you want to allow this?
                             // Yes -> return non-const
                             // No -> return const
}

如果要保留参数的限定符,请使用inout(请参阅 Adams 答案)或手动检查限定符以获得更复杂的选择。

无论哪种选择,请记住自动类型扣除:

auto third = first + second;
third.a = 42; // Error if returns const

Type fourth = first + second;
fourth.a  = 42; // Fine in both cases, struct was copied

最后,它是关于您作为类型设计师的意图,类/结构应该如何表现。

于 2013-01-26T11:44:51.000 回答