2014-11-14 71 views
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 

回答

1

關聯數組文本默認情況下是可變的。

要解決,你可以替換:

  NullableAAT naav = [KeyTInit:ValT.init]; 

有:

  alias CAA = typeof(naa.get()); 
      CAA aa = [KeyTInit:ValT.init]; 
      NullableAAT naav = aa; 

這將申報AA與正確的常量性,這將通過構造的inout傳播到Nullable

奇怪的(也許並不陌生。這可能是因爲如此多的錯誤後,編譯器只是放棄)是該錯誤是不存在的類型的所有組合,只是那些有UBYTE作爲重點類型。

是的,它在第二次循環的第一次迭代之後停止。您可以通過從元組頭部刪除類型來進行測試。

+0

那麼我猜測AAs還沒有從唯一性推理中受益?還是由於其他原因,文字不能被推斷爲常量,不可變等? – Meta 2014-11-14 17:56:45

+0

這對AAs並不特別 - 你的代碼期望const從變量聲明一直傳播,通過Nullable inout構造函數,直到AA。實際上,傳播的方向是不同的:構造函數參數的常量定義了構造對象的常量。 – 2014-11-14 18:24:15