我真的很困惑他們在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字節)而不是一些令人困惑的數組類型,它誤導了實數的大小目的。我可以找到很多有利條件,但這是我現在看到的。你會說什麼 - 這是個好主意嗎?
恐怕這個答案是[讀一本好書](http://stackoverflow.com/q/388242/1171191)。這裏的問題或答案有點太多了。但請記住,「C++」不是一門學術語言。根據實際需要,它已經發展了很長時間。所以是的,這有點古怪。 – BoBTFish
真正的解決方案不是有「右值指針」,而是用適當的RAII容器('string/vector/array/...')替換傳統的C數組。除非創建自己的容器類,與C代碼連接以及可能還有其他一些有限的情況,否則應該很少使用傳統C數組(注意我如何堅持* legacy *和* C *)。對於C++容器,你已經有了右值並且可以移動語義,所以你的建議可以直接使用,但沒有內存管理的麻煩。 – syam