我相信D有可能为其编译器套件添加另一个很酷的功能,即禁止对纯函数进行非副作用调用的能力。
例如
auto s = "a";
toStringz(a);
应该是错误的
a == "";
目前DMD中的错误为
Error: == has no effect in expression (s == "")
这样的功能会阻止程序员意外调用非静音算法时,他希望它具有就地(变异)语义。这不需要使用GCC __attribute((warn_unused_result))
等__attribute((const))
等属性明确标记函数。
DMD的待办事项列表上有这样的功能吗?
答案 0 :(得分:3)
DMD没有正式的TODO列表。它的开发主要基于志愿者的工作,虽然一些增强请求在bugzilla中得到“预先批准”的标签,但是当这个功能可以实现时它没有说明任何关于术语的信息,或者它将被实现。
鉴于现在有很多更严重的问题需要解决,我几乎无法期待近年来实施的那些小问题。
此外,您的问题实际上看起来像提案,更适合官方DMD / Phobos bugzilla:http://d.puremagic.com/issues/
答案 1 :(得分:0)
问题在于D大量使用模板。您无法始终控制模板或其参数。例如:
class Foo{
/*...*/
pure int foo(){
/*...*/
}
/*...*/
}
void bar(T)(T arg){
/*...*/
arg.foo();
/*...*/
}
现在您无法使用bar
参数调用Foo
。这可以通过删除foo
的纯度(可能会破坏代码和/或损害性能)或将bar
更改为将foo()
的结果存储在变量中来修复(黑客攻击) (这也很糟糕,因为它永远不会使用该值,因为foo
的返回类型可能无效甚至更糟 - 带有析构函数的struct
(它的调用将被推迟到结尾bar
执行。)当然 - 只有你可以改变Foo
或bar
......