首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在D中检测非变异调用语句到纯函数

在D中检测非变异调用语句到纯函数
EN

Stack Overflow用户
提问于 2013-03-02 11:28:53
回答 2查看 143关注 0票数 0

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

例如

代码语言:javascript
复制
auto s = "a";
toStringz(a);

错误应该就像

代码语言:javascript
复制
a == "";

当前DMD中的错误为

代码语言:javascript
复制
Error: == has no effect in expression (s == "")

这样的特性将防止程序员意外调用非静音算法时,他希望它具有就地(变异)的语义。这不需要使用GCC的__attribute((warn_unused_result))__attribute((const))这样的属性显式地标记函数。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-02 11:43:25

DMD没有官方的待办事项清单。它的开发主要是基于志愿者的工作,虽然一些增强请求在bugzilla中得到了“预先批准”标记,但是它并没有说明什么时候可以实现这个特性,或者什么时候会实现它。

考虑到现在有很多更严重的问题要解决,我很难想象在附近的几年里会有一些次要的事情发生。

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

票数 3
EN

Stack Overflow用户

发布于 2013-03-02 16:39:11

问题是D对模板的大量使用。您并不总是控制模板或它的参数。例如:

代码语言:javascript
复制
class Foo{
    /*...*/
    pure int foo(){
        /*...*/
    }
    /*...*/
}

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

现在,您不能用bar参数调用Foo。这可以通过删除foo的纯净性(这可能会破坏代码和/或损害性能)或更改bar来存储foo()的结果来修复(这也很糟糕,因为它从不使用该值,因为foo的返回类型可能无效,甚至更糟--一个带有析构函数的struct (它的调用将被推迟到bar's执行的末尾)。当然,这只有在您可以更改Foobar时才有可能.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15173942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档