D中“范围”的含义(对于参数)

时间:2011-01-17 08:42:51

标签: d

中的scope是什么
void foo(scope void* p) { }

意思?

(我不是在讨论scope(exit)scope int x = 5;,而是在参数列表中使用的scope。)

2 个答案:

答案 0 :(得分:22)

D中scope有3种用途。

  1. scope陈述。这是您使用scope(success)scope(failure)scope(exit)时的情况。如果没有抛出异常,抛出异常,或者无论是否为成功,失败和退出抛出异常,退出scope语句所在的范围时,将运行以下块中的语句分别。 scope的使用保留在语言中。

  2. scope关于局部变量。这将变量放在堆栈上 - 即使它是一个类。该对象在离开范围时被销毁。这种scope的使用是不安全的,最终会从语言中删除(尽管std.typecons.scoped会替换那些想要危险生活的人。)

  3. scope关于函数参数(这是您要询问的用例)。当放置在作为委托的参数上时,这意味着不能转义对该参数的引用(即,分配给全局变量)。当编译器在委托上看到这一点时,它将避免在获取本地函数的地址时分配闭包。这在opApply循环(reference post on newsgroup)中至关重要。目前,scope对除委托之外的任何函数参数都没有影响,并且对于所有其他类型都会被忽略,尽管在将来的某个时候它可能会或可能不会被扩展以影响像指针这样的类型以防止它们逃脱功能

  4. 在函数参数上使用时,in关键字是const scope的别名,这通常是无意中使用scope函数参数的方式。

答案 1 :(得分:0)

在数字火星新闻组中搜索,我在该上下文中找到了两篇关于范围的半相关帖子:herehere

从阅读这两篇文章开始,函数参数范围似乎没有做任何有用的事情,它是为了向后兼容。它甚至听起来像D2以后的版本可能会完全删除限定符。