5

次のコードは、私のシステムでは問題なくコンパイルされます。

#include <array>
#include <type_traits>

static_assert(std::is_same<std::array<int, 5>::iterator,
                           std::array<int, 7>::iterator>::value, ":(");

その動作は標準で保証されていますか? イテレータの型は配列のサイズに依存しませんか?

保証されている場合、要素の型から抽象化してサイズを無視する方法はありますか?

template<typename T, size_t n>
void foobar(std::array<T, n>::iterator it)

つまり、サイズに言及せずに上記の配列固有のコードを記述する方法はありますnか?

リリース モードではイテレータT*はおそらくT*.

4

3 に答える 3

4

いいえ、保証はありません。標準はちょうど言う

typedef implementation-defined    iterator;

反復子の型は、プレーン ポインター、 のメンバーであるarrayクラス、またはプレーン ポインターをラップする別のクラスにすることができます。

メンバークラスの場合、配列サイズ依存します。そうでなければそうではないでしょう。

于 2012-10-10T16:28:04.700 に答える
3

いいえ、保証されません。各配列型には、型が実装定義されarray<T, size_t>ているという名前のネストされたメンバー typedef があります。iterator

于 2012-10-10T16:25:24.767 に答える
1

簡単な答えは、もう少し一般的なものにすることです。からのイテレータのみを許可したいのはなぜstd::arrayですか?

template <typename Iterator>
void foobar( Iterator it )

コードの 2 番目の部分では、タイプTとサイズnは推定不可能なコンテキストにあります。概念的には、複数のstd::arrayタイプが同じiteratorタイプを持つことができます。または、あなたが言及したように、それは単に である可能性があり、可能なT*ものを見つけることは不可能です。std::arrayT*iterator

于 2012-10-10T16:27:55.343 に答える