質問
すっか.もう奇妙な問題のプログラミング言語.きるような新しい配列のようになります:
import std.stdio;
void main()
{
char[] variable = "value";
writefln(variable);
}
のDMDコンパイラは常に与えてくれるこのエラー:
テストです。d(5):エラー:できない暗黙のうちに に変換す表現("value"の型 不変式(char[5u])をchar[]
うのですが?私が使っているの2.014アルファ(利用可能 こちらの)をUbuntu.
解決
私は、これが役立つことがあり、ガイドのアレイ部の周囲に探索した
文字列は文字の配列です。文字列リテラルは、文字配列を記述するだけの簡単な方法です。文字列リテラルは、(読み取り専用)不変です。にの
char[] str1 = "abc"; // error, "abc" is not mutable
char[] str2 = "abc".dup; // ok, make mutable copy
invariant(char)[] str3 = "abc"; // ok
invariant(char)[] str4 = str1; // error, str4 is not mutable
invariant(char)[] str5 = str1.idup; // ok, make invariant copy
をrel="noreferrer"> href="http://www.digitalmars.com/d/2.0/arrays.html"ます。
他のヒント
基本的には、つまりは、文字列リテラルに保存され読み取り専用部のメモリを消費します。 char[]
は "変更可能な配列の変更可能な文字", い場合に書き込まれ、実行時ンダリングする能力があります。
そのコンパイラはんを保護しようとしています。
invariant(char)[]
手段 "変更可能な配列の不変式の文字", そうです。
PS:ない場合 必要 できる char[]
, するために使用 auto
, として、 auto variable = "value"
.解放されますから考えると、そのタイプ:)
autoを使用すると、タイプが何であるかを心配しないでください。
auto s = "some text";
タイプに関するコンパイラ心配をしましょう。
D言語には主に2つのバージョンがあります。コードがは両方でコンパイルするように記述することもできる。
これらは、一般に、互いに相互に互換性がありませんD1は、あなたが提供したコードが書き込まれているようだものです。それは不変の配列の概念がありません、したがって、これは動作します。
D2は、あなたがそれ故に2は、コンパイラのバージョン番号を開始する、としてそれをコンパイルしようとしているものです。メインD2固有の特徴の一つは、constの不変/不変データ参照のこの概念です。
char[] text; // mutable data
const(char)[] ctext; // data may be mutable or immutable - but either way,
// it will not be changed through this reference
invariant(char)[] itext; // immutable data
D2で文字列リテラルは、不変データとして分類され、従ってチャーに割り当てることができない[]が、唯一const(char)[]
又はinvariant(char)[]
(またはwchar文字又はDCHAR当量)。
string
あなたは便宜上またはD1の互換性のためにいずれかを使用することをお勧めしますinvariant(char)[]
の別名です。