意味

2011-01-17 15 views
13

意味

void foo(scope void* p) { } 

scopeは何を意味するのでしょうか?

(。パラメータリスト内で使用されるように、私はおよそscope(exit)またはscope int x = 5;、が、約scopeを話ではない)

答えて

22

D.

scopeための3つの用途
  1. scopeの文があります。これは、scope(success),scope(failure)、またはscope(exit)を使用している場合です。次のブロック内のステートメントは、例外がスローされた場合、または成功、失敗、および終了のそれぞれに対して例外がスローされたかどうかに関係なく、scopeステートメントがあるスコープを終了するときに実行されます。 scopeのこの使用は言語にとどまっています。

  2. scopeローカル変数。これは、クラスであっても変数をスタックに置きます。オブジェクトはスコープを離れるときに破棄されます。 scopeのこの使用は安全ではなく、最終的には言語から削除されます(ただし、人生を危険にさらしたい人にはstd.typecons.scopedが代わりになります)。

  3. scope(これは、あなたが尋ねているユースケースです)。代理人であるパラメータに置かれた場合、そのパラメータへの参照をエスケープすることはできません(つまり、グローバル変数に代入すること)。コンパイラがデリゲートでこれを見ると、ローカル関数のアドレスをとるときにクロージャを割り当てるのを避けることができます。これは、ループ(reference post on newsgroup)には不可欠です。現在、scopeは、デリゲート以外の関数パラメータには影響を与えません。また、他のすべての型では無視されますが、将来のある時点で関数のエスケープを防ぐポインタなどの型に影響を与えることがあります。

関数パラメータに使用される場合、inキーワードは、関数パラメータのscopeが誤って使用されます頻度である、const scopeの別名です。

+1

私は#3を探していた...それは素晴らしいです!私はいつもそれをやる方法を疑問に思った、ありがとう! :) – Mehrdad

+0

@Lambert:これはDウェブサイトには記載されていないようですが、私は報告書を発行しましたので、すぐに文書に追加される可能性があります。 –

+0

@Andrej:クール、ありがとう! :) – Mehrdad

0

デジタル火星のニュースグループに検索、私はそのコンテキスト内のスコープについての2つの半関連の記事が見つかりました: hereおよびhere

これらの2つのポストを読むことから、関数のパラメータスコープは役に立たないと思われ、後方互換性のためにそこにあります。 D2がその修飾子を完全に削除した後のバージョンのように聞こえるかもしれません。