0

我相信 D 有可能在其编译器套件中添加另一个很酷的功能,即禁止对纯函数进行非副作用调用的能力。

例如

auto s = "a";
toStringz(a);

应该像错误一样

a == "";

目前 DMD 中的错误为

Error: == has no effect in expression (s == "")

这样的功能可以防止程序员在期望它具有就地(变异)语义时意外调用非静音算法。这无需使用 GCC 的属性等显式标记__attribute((warn_unused_result))函数__attribute((const))

DMD 的待办事项列表中有这样的功能吗?

4

2 回答 2

3

DMD 没有官方的 TODO 列表。它的开发主要基于志愿者的工作,虽然一些增强请求在 bugzilla 中获得了“预先批准”的标签,但它并没有说明什么时候可以实现这个功能或者根本不会实现这个功能。

鉴于现在有很多更严重的问题需要解决,我几乎不能指望在不久的将来实施一些次要的事情。

此外,您的问题实际上看起来像提案,更适合官方 DMD/Phobos bugzilla:http ://d.puremagic.com/issues/

于 2013-03-02T11:43:25.093 回答
0

问题在于 D 大量使用模板。您并不总是可以控制模板或其参数。例如:

class Foo{
    /*...*/
    pure int foo(){
        /*...*/
    }
    /*...*/
}

void bar(T)(T arg){
    /*...*/
    arg.foo();
    /*...*/
}

现在你不能barFoo参数调用。这可以通过删除foo' 的纯粹性(这可能会破坏代码和/或损害性能)或barfoo()' 的结果更改为变量(这也很糟糕,因为它从不使用该值并且因为foo' s 返回类型可能是 void 甚至更糟 -struct带有析构函数的 a(它的调用将被推迟到bar' 的执行结束)。当然 - 只有当你可以改变Foobar......

于 2013-03-02T16:39:11.447 回答