2
下面的代碼在編譯的時候給了我一個奇怪的錯誤:可空INOUT構造函數創建可變對象
import std.conv: to;
import std.typecons;
import std.traits;
void main()
{
alias BuiltinScalars = TypeTuple!(ubyte, byte, ushort, short, uint, int, ulong, long,
float, double, real, char, wchar, dchar, bool,
ifloat, idouble, ireal, cfloat, cdouble, creal);
foreach (T; BuiltinScalars)
{
foreach (ValT; BuiltinScalars)
{
alias KeyT = T;
alias AAT = ValT[KeyT];
foreach (NullableAAT; TypeTuple!(Nullable!AAT, const(Nullable!AAT), immutable(Nullable!AAT)))
{
NullableAAT naa;
assert(naa.to!string() == "Nullable.null");
static if (!isSomeString!KeyT)
enum KeyTInit = KeyT.init;
else
enum KeyTInit = `""`;
NullableAAT naav = [KeyTInit:ValT.init];
assert(naav.to!string() == '[' ~ KeyTInit.to!string() ~ ':' ~ ValT.init.to!string() ~ ']');
}
}
}
}
我不知道這個問題是這段代碼是什麼。可爲空的只有一個構造函數,簽名this(inout T value) inout
。
奇怪的事情(或者可能並不奇怪,可能是因爲編譯器放棄了這麼多錯誤)是因爲所有類型的組合都沒有出現錯誤,只是那些以ubyte作爲關鍵類型的錯誤。完整的錯誤輸出是:
bug.d(46): Error: inout constructor std.typecons.Nullable!(ubyte[ubyte]).Nullable.this creates mutable object, not immutable
bug.d(46): Error: inout constructor std.typecons.Nullable!(byte[ubyte]).Nullable.this creates mutable object, not immutable
bug.d(46): Error: inout constructor std.typecons.Nullable!(ushort[ubyte]).Nullable.this creates mutable object, not immutable
bug.d(46): Error: inout constructor std.typecons.Nullable!(short[ubyte]).Nullable.this creates mutable object, not immutable
bug.d(46): Error: inout constructor std.typecons.Nullable!(uint[ubyte]).Nullable.this creates mutable object, not immutable
bug.d(46): Error: inout constructor std.typecons.Nullable!(int[ubyte]).Nullable.this creates mutable object, not immutable
bug.d(46): Error: inout constructor std.typecons.Nullable!(ulong[ubyte]).Nullable.this creates mutable object, not immutable
bug.d(46): Error: inout constructor std.typecons.Nullable!(long[ubyte]).Nullable.this creates mutable object, not immutable
bug.d(46): Error: inout constructor std.typecons.Nullable!(float[ubyte]).Nullable.this creates mutable object, not immutable
bug.d(46): Error: inout constructor std.typecons.Nullable!(double[ubyte]).Nullable.this creates mutable object, not immutable
bug.d(46): Error: inout constructor std.typecons.Nullable!(real[ubyte]).Nullable.this creates mutable object, not immutable
bug.d(46): Error: inout constructor std.typecons.Nullable!(char[ubyte]).Nullable.this creates mutable object, not immutable
bug.d(46): Error: inout constructor std.typecons.Nullable!(wchar[ubyte]).Nullable.this creates mutable object, not immutable
bug.d(46): Error: inout constructor std.typecons.Nullable!(dchar[ubyte]).Nullable.this creates mutable object, not immutable
bug.d(46): Error: inout constructor std.typecons.Nullable!(bool[ubyte]).Nullable.this creates mutable object, not immutable
bug.d(46): Error: inout constructor std.typecons.Nullable!(ifloat[ubyte]).Nullable.this creates mutable object, not immutable
bug.d(46): Error: inout constructor std.typecons.Nullable!(idouble[ubyte]).Nullable.this creates mutable object, not immutable
bug.d(46): Error: inout constructor std.typecons.Nullable!(ireal[ubyte]).Nullable.this creates mutable object, not immutable
bug.d(46): Error: inout constructor std.typecons.Nullable!(cfloat[ubyte]).Nullable.this creates mutable object, not immutable
bug.d(46): Error: inout constructor std.typecons.Nullable!(cdouble[ubyte]).Nullable.this creates mutable object, not immutable
bug.d(46): Error: inout constructor std.typecons.Nullable!(creal[ubyte]).Nullable.this creates mutable object, not immutable
那麼我猜測AAs還沒有從唯一性推理中受益?還是由於其他原因,文字不能被推斷爲常量,不可變等? – Meta 2014-11-14 17:56:45
這對AAs並不特別 - 你的代碼期望const從變量聲明一直傳播,通過Nullable inout構造函數,直到AA。實際上,傳播的方向是不同的:構造函數參數的常量定義了構造對象的常量。 – 2014-11-14 18:24:15