D言語 Part32

このエントリーをはてなブックマークに追加
517デフォルトの名無しさん
関数引数に scope つけると何が変わるの?
コンパイル時のものか実行時のものかもわからない
教えてえろいひと
518デフォルトの名無しさん:2013/11/17(日) 20:25:30.20
void foo(scope Object obj) {
global = obj;
}

ドキュメントによるとこれがコンパイルエラーになるという意味だと思うんだが…ならぬ
519デフォルトの名無しさん:2013/11/17(日) 22:41:53.03
scopeは今はうまくエラーがでないんじゃなかったっけ?
Bugzilla登録されてたはず
520デフォルトの名無しさん:2013/11/17(日) 23:11:49.72
521デフォルトの名無しさん:2013/11/19(火) 23:48:43.89
>>506 -release を付けると 範囲チェックを省くってのは明記されてるよ………コマンドラインのところに(ボソッ

正しくは、現状の動作は
・-releaseをつけると@safeがついてない関数で範囲チェック用のコード生成が省略される
・-noboundscheckをつけると@safeな関数のコードも範囲チェックが省かれる


つまり
・デフォルトでは範囲チェックを実施(安全側に倒している)
・-releaseをつけると@safe保証が必要なところのみに範囲チェックを限定
・-noboundscheckはスピード重視の方向け、素人にはお勧めしない
となる
522デフォルトの名無しさん:2013/11/19(火) 23:52:43.66
>>517 関数引数に scope つけると何が変わるの?

今のところ意味があるのはdelegate型の引数につけた場合のみ。
void foo(scope int delegate() dg) { ... }

dgに渡されるデリゲートがfooの呼び出し側でクロージャを作らないことを保証してくれる。
523デフォルトの名無しさん:2013/11/20(水) 10:58:08.80
>>522
ありがと。実行時に振る舞いが変わることは確認できた