-1

C++ でそれらが存在することに本当に混乱しています。問題は、それらが部分的に実装されていることです (少なくとも VC++ 2013 では)。たとえば、動的に割り当てられたメモリの配列を配列オブジェクトに割り当てることはできません。

int pArray[] = new int[2];

エラーコード付き:

cmd_c++_test___.cpp(88): エラー C2440: 'initializing' : 'int *' から 'int []' に変換できません

しかし、「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 を右辺値配列のみに制限しますが、2 番目の例でわかるように、次のように動作します。

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
}

右辺値ポインターが渡された場合は最初のものが呼び出され、そうでない場合は2番目のものが呼び出されます。したがって、次のようなことができるようになります。

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

このようなものを作成する利点は明らかです。まず、より柔軟な機能を作成する能力。2番目-読みやすさ。右辺値へのポインターを示すためにトークンを使用すると、実際のサイズを誤解させる紛らわしい配列タイプではなく、ポインター(4バイト)を扱っていることがユーザーにわかるため、はるかに理解しやすくなります。物体。私は多くの利点を見つけましたが、これが今のところ私が見ているものです. あなたはどう思いますか?これは良い考えですか?

4

1 に答える 1