10

私がこのようなことをすると:

int my_array[5] = {1, 2, 3, 4, 5};
for (int &x : my_array) {
    x *= 2;
}

C++11 は明らかに、配列に 5 つの要素しかないことを認識しています。この情報は my_array オブジェクトのどこかに保存されていますか?

もしそうなら、開発者として私が利用できない正当な理由はありますか (または?!?!?)? C++ 開発者が扱っている配列の境界を常に知っていれば、世界の問題の多くは解決されるようです。

4

3 に答える 3

12

これは単に、言語が機能するために必要なものであり、コンパイラが実装する必要があります。明らかに の完全な型 (つまり、サイズは型のmy_array一部int[5])あるため、この情報はすぐに入手できます。

一般に信じられていることとは反対に、 free の/関数は実際には使用されていませんが、単純にトリックを実行できるように見えます (ただし、このアプローチを破る ADL に関する問題があります)。std::begin()std::end()

于 2012-11-13T20:28:47.107 に答える
6

利用可能です -標準 C++ で配列に対してbeginおよびを定義できます。end配列のサイズは型にエンコードされます。

一般的な方法は、配列への参照を使用することです。

サイズ関数の例を次に示します。

template<typename T, size_t N>
size_t array_size(T (& const)[N])
{
    return N;
}
于 2012-11-13T20:31:03.857 に答える
5

いいえ、オブジェクトの一部ではありません。しかし、それはタイプの一部です。それ5が配列宣言の です。ただし、これは機能しません。

void f(int arr[5]) {
    for(int& x: arr) {
        // whatever
    }
}

ここでの配列の名前は、その最初の要素へのポインターに分解されるためです。つまり、引数の宣言はint *arr、サイズ情報がないものと同等です。

于 2012-11-13T20:30:43.130 に答える