我对它们在 C++ 中的存在感到非常困惑。问题是它们是部分实现的(至少在 VC++ 2013 中)。例如,您不能将动态分配的内存数组分配给数组对象:
int pArray[] = new int[2];
带有错误代码:
cmd_c++_test___.cpp(88): error C2440: 'initializing' : cannot convert from 'int *' to 'int []' 1> 没有对数组类型的转换,虽然有对数组的引用或指针的转换
但是如果你将一个'int *'传递给一个参数类型为'int []'的函数,这将是合法的:
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):错误 C2090:函数返回数组
因此,这些“本机”数组存在的唯一原因是为了推断连续右值元素的大小,如下所示:
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 - 区分右值指针
我认为如果将那些无用的“本机”数组替换为右值指针之类的东西会非常好。像这样的东西:
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 字节)而不是一些混淆数组类型,这会误导真实的大小目的。我可以找到很多优势,但这是我现在看到的。你会说什么 - 这是个好主意吗?