immutableな静的配列の初期化


投稿ツリー



前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2011/9/23 3:41
KU6  新米   投稿数: 5
ランタイム時に決定する初期値ですか。申し訳ないよくわかってなかった。

他の妥協案としては動的配列の宣言にしてしまうとかですかね。
あとは初期化時だけキャストしてimmutableを外してしまうとか・・・

確かにコンパイラが対応してくれるならうれしいですね。
投票数:15 平均点:6.00
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2011/9/23 23:58
SHOO  管理人   投稿数: 658
初期化時だけキャストでimmutable外して代入はshared static this()であっても未定義動作じゃなかろうか…どうなんだろう。

他には、
#code(d){{{

private shared uint[100] _ary;

shared static this()
{
foreach (i; 0..100)
{
_ary[i] = i;
}
}

public ref immutable(uint[100]) ary()
{
return *cast(immutable(uint[100])*)&_ary;
}
}}}

こんなのとかでしょうかね。
投票数:20 平均点:5.00
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2011/9/30 1:54
SHOO  管理人   投稿数: 658
同じコンストラクタでの初期化つながりで…

#code(d){{{
struct S {
@disable this();
int i;
this(int x){ i = x; }
}

class C {
S s;
this() {
s = S(10);
}
}

void main() {
auto c = new C;
}
}}}
#code(console){{{
main.d(15): Error: default construction is disabled for type C
}}}

これって動くべきだと思いますか?
私は動くべきだと思いますが…
仮に動くべきだという場合、dmdの実装は難しいでしょうか?
投票数:20 平均点:5.50
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2011/9/30 2:11 | 最終変更
9rnsr  新米   投稿数: 7
#code(d){{
class C {
S s = S.init;
this() {
//s = S(10);
}
}
void main() {
auto c = new C();
}
}}
だと動きませんが

#code(d){{
class C {
S s = S.init;
this(int) {
//s = S(10);
}
}
void main() {
auto c = new C(10);
}
}}
だと動きますね。

上が動かないのはバグだと思いますが、どちらにしろCのメンバとしてsを定義する場合は明示的なInitializer(=S.init)が必要なようです。
投票数:16 平均点:3.13
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2011/9/30 2:22
SHOO  管理人   投稿数: 658
S s = S.init;
これが許容されているのも謎ですね。必ずコンストラクタを通さなければ使えなくなる、という意図に反する気がします。
(S.initは使えなくなるべきかと。)
もしS.initが使えるのが仕様だとするなら、本格的に@disable this();はいらない子ですね…。
投票数:24 平均点:4.58
返信する

このトピックに投稿する

題名
ゲスト名
投稿本文

  条件検索へ


メインメニュー

ログイン

ユーザー名:


パスワード:





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

Menu