2013-10-27 54 views
-1

我真的很困惑他們在C++中的存在。問題在於它們部分實現了(至少在VC++ 2013中)。與錯誤代碼C++本機數組?

int pArray[] = new int[2]; 

::例如,你不能的存儲器中的動態地分配的數組分配給數組對象

cmd_c++_test___.cpp(88): error C2440: 'initializing' : cannot convert from 'int *' to 'int []' 1> There are no conversions to array types, although there are conversions to references or pointers to arrays

但是,如果你傳遞一個「詮釋*」的功能與參數類型 '詮釋[]' 這將是合法的:

void Func(int a1 []) 
    { 
     return; 
    } 

//Somewhere in main() 

     int *pArray = new int[2]; 

     Func(pArray); 

你也不能返回數組:

int (FuncAn(int a1[]))[] 
{ 
    return; 
} 

與錯誤:

cmd_c++_test___.cpp(57): error C2090: function returns array

因此,對於那些「本土」陣列的存在的唯一理由是推導連續右值元素的大小,像這樣:

int pArray[2] = { 0, 2 }; 
size_t szArray = sizeof(pArray)/sizeof(int); 

而且否則它的行爲就像一個糟糕的指針。我的意思是,如果我們能夠以某種方式限制輸入,我們可以在數組參數中使用它。例如像這樣的功能:

void Func(int a1 []) 

限制A1是唯一一個右值數組,但你可以在第二個例子中看到的,它只是起到這樣的:

void Func(int *a1) 

而且,這裏沒有顯示,如:

void FuncAn(int a1 [2]) 

也期待有:C++11 - Distinguishing rvalue pointers

我認爲它會如果那些無用的「本地」數組被替換爲像右值指針那樣非常好。事情是這樣的:

const int [rvalue pointer token] pArray = { 0, 2 }; 
size_t szArray = sizeofDataPointedByRvaluePointer(pArray)/sizeof(int); 

並能夠像創建函數:

void PrintString(const char[rvalue pointer token] pString) 
{ 
    //Do Some printing the string code 
} 

void PrintString(const char *pString) 
{ 
    //Do Some printing the string code 

    delete [] pString; //Delete temporary object 
} 

雖然第一個會,如果右值指針傳遞和調用的第二個如果不是。所以你可以做這樣的事情:

const char[rvalue pointer token] StringArray = "Hello World!"; 

PrintString(StringArray); //void PrintString(const char[rvalue pointer token] pString) is invoked and the String is only printed without any other special handling 

char *pString = new char[sizeofDataPointedByRvaluePointer(StringArray)]; 

memcpy(pString, StringArray, sizeofDataPointedByRvaluePointer(StringArray)); 

PrintString(pString); //void PrintString(const char *pString) is invoked and after the string is printed the memory allocated for it is destroyed 

你可以清楚地看到創建類似這樣的好處。首先是創造更多靈活功能的能力。其次 - 更好的可讀性,使用某個標記來指示右值的指針更容易理解,因爲用戶知道他正在處理指針(4字節)而不是一些令人困惑的數組類型,它誤導了實數的大小目的。我可以找到很多有利條件,但這是我現在看到的。你會說什麼 - 這是個好主意嗎?

+4

恐怕這個答案是[讀一本好書](http://stackoverflow.com/q/388242/1171191)。這裏的問題或答案有點太多了。但請記住,「C++」不是一門學術語言。根據實際需要,它已經發展了很長時間。所以是的,這有點古怪。 – BoBTFish

+0

真正的解決方案不是有「右值指針」,而是用適當的RAII容器('string/vector/array/...')替換傳統的C數組。除非創建自己的容器類,與C代碼連接以及可能還有其他一些有限的情況,否則應該很少使用傳統C數組(注意我如何堅持* legacy *和* C *)。對於C++容器,你已經有了右值並且可以移動語義,所以你的建議可以直接使用,但沒有內存管理的麻煩。 – syam

回答

0

int數組[]僅用於如下(我相信)

int array[] = { 2, 5, 7, 7, 2 }; 

而且因爲你需要知道數組有多大準確地返回它返回一個數組是不可能的。我可能會誤解,但typedef int ArrayType [8];可能允許您返回一個ArrayType,因爲它具有已定義的大小。但不知道。

希望能回答一些問題,但正如BoBTFish所說,讀了一本好書,並沒有因爲了解所有原因而受到壓力,隨着你的進展,你學到了很多東西。