3
void increment(ref int i)
{
    ++i;
}

class Class
{
    immutable int member;

    this(int parameter)
    {
        member = parameter;
        ++member;           // okay
        increment(member);  // compile-time error
    }
}

Why is ++member okay, but increment(member) isn't? Shouldn't both behave the same way?

4

3 回答 3

5

可能是因为对incrementis not的引用scope,所以它有可能会越过构造函数的范围,这会破坏 的不变性member,并且编译器无法验证它是否正常。

(它可能scope也不起作用,但它应该。如果实施得当,我认为scope会修复很多这样的错误,并提供有趣的优化。如果没有,我会说这是一个漏洞。)

我之前已经指出了半相似的错误,但有代表。
const/immutable 在 D 中确实存在这样的问题。

于 2012-08-08T08:35:35.573 回答
3

如果increment是这样呢?

int* p;
void increment(ref int i)
{
    p = &i;
}

哦,您创建了对不可变数据的可变引用,破坏了类型系统。

于 2012-08-08T12:22:16.843 回答
0

我猜

this(int parameter) {
    member = parameter;
    ++member;
}

相当于

Class(int parameter): member(parameter+1) {}

在 C++ 中。

我认为member字段在构造函数中并不是真正可变的,所以编译器可以优化它来初始化它。但它不能通过调用另一个函数来做到这一点。

PS。它适用于 ideone:http: //ideone.com/5ym5u

于 2012-08-08T10:41:25.447 回答