D言語におけるrvalue reference


投稿ツリー



前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 .2 | 投稿日時 2012/4/12 13:56
tama  一人前   投稿数: 111
D言語にもrvalueな季節がやってきました.

[dmd-beta] rvalue references: http://forum.dlang.org/thread/4F84D6DD.5090405@digitalmars.com

なんでdmd-internalsとかじゃなくてdmd-betaでこの議論が広まっちゃったのかわかりませんが,とりあえず現状まとめておきます.

* Walter and Andrei proposal

Stevenも疑問点はあるものの賛成という感じ

- rvalueをref(ref constとかに限定しない)でとれるようにする.テンポラリが存在してるんだから,それを参照すればよい
-- なのでstruct literalはlvalueに戻したい
-- func(5)とか,これを中で++とかしてもクリティカルな問題ではないでしょ by Andrei
-- func(S s) / func(ref S s)には新しいルールもうける

- intからdoubleとか,sub classからsuper classとか,そういうimplicit conversionなrefは許可しない

- 将来的にはrefからアドレスを取るのは禁止!そういうのはポインタでやるべき!!
-- MartinとかStevenはvoid*(or void[])でその辺どうにかSafeDの範囲でしたい,みたいなこと言ってる,たぶん

* kenji and jonathan

- いや,rvalueはrvalueでしょ.lvalueにしなくても,そのままrefで束縛できれば問題ない

** rvalue referenceの履歴

- 2.058までstruct literalはlvalue
- 2.059の開発中rvalueに変更される
-- 色々整備が追いつかないのでやばい
- Walter and Andreiが上記の提案を行う
- 今朝lvalueへのロールバックするのをWalterがコミット
- 実装がアレだったのでkenjiがrvalueをrefでとれるようにpull req
-- 普通に通った.Walterの考えがよく分からず.
投票数:18 平均点:5.00
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2012/4/12 17:04 | 最終変更
9rnsr  新米   投稿数: 7
経緯とかは大体OKです。

実コードで説明すると、2.059では以下のように変更が入ります。

#code("D"){{
struct S { int n; }

void foo(ref S s) {}
void bar( S s) {}
int baz( S s) { return 1; }
int baz(ref S s) { return 2; }
void main()
{
// 2.058までは構造体リテラルは左辺値扱いだったのでこれをrefで束縛できていた
// 2.059では構造体リテラルは右辺値になり、さらにこれをrefで束縛可能(rvalue reference)になっている
// →意味は変わっているが既存コードの変更は起きない
foo( S(0) );

// もちろん右辺値は今まで通りnon-refで受け取れる
bar( S(0) );

// 2.058までは構造体リテラルが左辺値扱いだったので、refとnon-refの両方にマッチしてambiguous errorになっていた (bug 5889)
// 2.059では、構造体リテラルは右辺値扱いなので、refとnon-refのオーバーロードに対してnon-refにマッチする
// (rvalue referenceへの束縛は右辺値で値を受け取るオーバーロード候補がない場合のみ行われる)
assert(baz( Sa(0) ) == 1);
}
}}

以下の挙動は2.059には未実装です

#code("D"){{
int foo(ref int s) { return 2; }

void main()
{
// struct以外のリテラルをrefに束縛する
foo(10);
}
}}
投票数:16 平均点:6.25
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2012/4/12 22:46
tama  一人前   投稿数: 111
http://forum.dlang.org/thread/4F84D6DD.5090405@digitalmars.com?page=3#post-1334230411.75843.YahooMailNeo:40web161706.mail.bf1.yahoo.com

Steven / Martin周りが新しいアプローチの問題点について指摘してます.この辺どういうルールにしようとしているのか気になるところです.

delegateとか含め,refからの&をはじくとする時どこまでトレースできるのか…
投票数:28 平均点:2.14
返信する

このトピックに投稿する

題名
ゲスト名
投稿本文

  条件検索へ


メインメニュー

ログイン

ユーザー名:


パスワード:





パスワード紛失  |新規登録

Menu