...ing logging 4.0

はてなブログに移行しました。D言語の話とかいろいろ。

const/immutable型修飾子

ネタがないので小出しにしてみる.


ここでは D において非常に重要な仕様である書き換え禁止を意味する型修飾子だけ説明します.
C では const だけでしたが,D にはその他に immutable があります.

const

import std.stdio;

void main()
{
	int a = 1;
	const(int) b = 1;
	
	a = 2;
	//b = 2; // エラー
	
	// 指す先を変更できて値を変更できないポインタ
	const(int)* pca = &a;
	pca = &a;
	//*pca = 2;
	
	// 指す先も値も変更できないポインタ
	const(int*) cpa = &a;
	//cpa = &a; //エラー
	//*cpa = 2; //エラー
}
  • D の const は修飾する型を()でくくる
    • ただし,記憶クラスの const の場合は()は不要で const int a = 1; でもよい
  • const は読み取り専用の view を意味する
    • constなポインタを通じて書き換えることはできないが他の場所ではそのポインタの内容を書き換えられるかもしれない
void f(const(int*) x){ assert(*x == 1); }
void g() {
    int a = 1;
    f(&a);
    a = 2; // ここでは書き換えられる
    f(&a); // assertion error
}

immutable

import std.stdio;

void main()
{
	int a = 1;
	immutable(int) b = 1;
	
	a = 2;
	//b = 2; // エラー
	
	// どこからも変更されない変数だけを指せて,指す先を変更できて,値を変更できないポインタ
	//immutable(int)* pia = &a; // エラー.aはどこかで変更されるかもしれない
	immutable(int)* pib = &b;
	pib = &b;
	//*pib = 2; //エラー
	
	// どこからも変更されない変数だけを指せて,指す先も値も変更できないポインタ
	//immutable(int*) ipa = &a; //エラー.aはどこかで変更されるかもしれない
	immutable(int*) ipb = &b;
	//ipb = &b; //エラー
	//*ipb = 2; //エラー
}
  • const と異なり, immutable で修飾された変数はどこからも書き換えることができない
void f(immutable(int*) x){ assert(*x == 1); }
void g() {
    int a = 1;
    //f(&a); // エラー.f()は immutable な変数へのポインタしか受け取れない
    
    immutable(int) b = 1;
    f(&b);
    //b = 2; // immutableなので書き換えられない
}