8

std::array<int,0>サイズがゼロの配列を持つとはどういう意味ですか?

これを投稿する前に SO で同様の質問をしましたが、これらの質問はすべて単純な配列型と C 言語に関するものであり、ほとんどが違法であると述べています。ただし、C++ ではarray<int,0>許可されています。

cppreference.comによると

長さゼロの配列 (N == 0) には特殊なケースがあります。その場合、array.begin() == array.end()これは一意の値です。サイズがゼロの配列に対するfront()orの呼び出しの効果は未定義です。back()

なぜ違法と定義されないのですか?

4

2 に答える 2

11

サイズがゼロの std::array,array を持つとはどういう意味ですか?

std::vectorたとえば、空または空のと同じstd::setです。

なぜ違法と定義されないのですか?

のサイズがコンパイル時の計算の結果である場合、ジェネリック プログラミングが特別なケースを処理する必要がないことを意味するため、合法にすることが望ましいです。std::array

テンプレートの特殊化のおかげで、それを合法的であると定義することが可能です。たとえば、Visual C++ に付属する実装はstd::array、次のような方法で特化しています。

template<class T>
class array<T, 0> // specialisation
{
    // ...

    size_type size() const
    {
        return 0;
    }

    T elements[1]; // the raw array cannot have a size of 0
};

すべてのコンパイラstd::arrayがそのように実装していると思います。

于 2015-03-08T17:03:45.537 に答える
2

std::array は、空にできる他の標準コンテナーと同様に見なされます。したがって、std::arrayN がゼロに等しい の特殊化は、空のコンテナーを定義します。

于 2015-03-08T17:05:49.940 に答える