2016-12-17 9 views
1

グラム++実装では、任意のアドレス値とstd::vector<T>::iteratorタイプのイテレータを構築するために、私のクライアントコードで私を可能にする:のstd ::ベクトル< T > ::イテレータ

int* i_ptr; 
std::vector<int>::iterator it(i_ptr); 

は、それが標準です能力、または実装の唯一の基盤ですか?

どこで使用するように設計されていますか?

+1

この規格では必須機能として定義されていません。 実際、このような構造は 'friend'shipを介して' std :: vector'からのみアクセス可能な非公開でなければなりません。 標準では、それが起こるのを拒否することさえありません(おそらく、それは*欠陥*ですが誰かがそれを報告できるかもしれません) –

答えて

2

これは単なる実装の詳細です。標準でコンパイルすることさえ保証されていません。また、gccの実装定義の動作やGNU C++の拡張機能にも記載されていないので、どのバージョンの変更でもスニペットが壊れる可能性があります。

あなたのコードでこの意味で「働く」ことに頼らないでください。 Visual Studioで

+0

btw、標準のコンテナイテレータに対する要件が記述されています。 ? –

+0

@GreenTree C++ 14標準の第23章またはcppreference.com前者はより形式的であり、後者は日常的な使用においてより有用です。 –

+1

iirc Chandler Carruthは、libC++が実装定義の動作として 'T!= bool'のために' std :: vector :: iterator'を 'T *'にすることを保証していると言いました。 –

1

2017 RCこれはコンパイルされません:

main.cpp(8): error C2664: 'std::_Vector_iterator<std::_Vector_val<std::_Simple_types<int>>>:: 
_Vector_iterator(std::_Vector_iterator<std::_Vector_val<std::_Simple_types<int>>> &&)': 
cannot convert argument 1 from 'int *' to 
'const std::_Vector_iterator<std::_Vector_val<std::_Simple_types<int>>> &' 
+0

これはコメントのようですが、回答ではありません) –

+0

また、デバッグモードまたはリリースモードであるかどうかを指定する必要があります。 –

+0

いいですね。これは[tag:language-lawyer]ではないので、コードをコンパイルしていない最近の主要なプラットフォームは、スニペットが移植可能な標準C++ではないことを示しています。 –

1

私はそれが標準機能であるとは思いません。実装定義の機能です。

多くの実装では、ベクトルイテレータは単純なポインタです。したがって、ベクトル< T>の場合、イテレータは単にTの型へのポインタです。いくつかの最適化のために行われます。そのような実装で

あなたがそのようなタイプの別のポインタでTを型へのポインタを初期化することができますので、Tを入力するポインタから初期化反復子を作成することが可能です。

もちろん、イテレータがTの型のポインタとして定義されている場合は、実装が定義されています。

関連する問題