這工作:是一個前向範圍的靜態數組?
int[] a = [ 1, 2, 3, 4 ];
fill(a, 5);
但這並不:
int[4] a = [ 1, 2, 3, 4 ];
fill(a, 5);
,我得到這個錯誤:
Error: template std.algorithm.fill(Range,Value) if (isForwardRange!(Range) && is(typeof(range.front = filler))) does not match any function template declaration
相反,我不得不這樣做是爲了讓它使用靜態陣列:
int[4] a = [ 1, 2, 3, 4 ];
fill(a[], 5);
有沒有人可以解釋這種行爲?
我是說你必須用'Array'和'SList'來切片?似乎有點設計缺陷。 – 2012-01-16 22:01:34
這不是一個真正的設計缺陷恕我直言。更多的情況是動態數組是奇怪的範圍特例。但是,由於它們是目前最常見的情況,因此我們習慣於這樣做。容器必須隱式轉換爲其IFTI的片類型,以便在傳遞給函數時不需要顯式切片,並且將使得將容器傳遞給模板化函數更加困難。而且我不確定所有切片類型都會被IFTI自動切片是一個好主意 - 即使在處理範圍時也是如此。 – 2012-01-16 23:02:51
你可以這樣想。容器 - 包括靜態數組 - 需要被切片以獲得範圍。所以,如果你想要任何理由的範圍 - 包括傳遞到基於範圍的函數 - 你必須明確地切片。但動態數組是_already_範圍而不是容器,所以切片是不必要的。 – 2012-01-16 23:05:36