グラム++実装では、任意のアドレス値とstd::vector<T>::iterator
タイプのイテレータを構築するために、私のクライアントコードで私を可能にする:のstd ::ベクトル< T > ::イテレータ
int* i_ptr;
std::vector<int>::iterator it(i_ptr);
は、それが標準です能力、または実装の唯一の基盤ですか?
どこで使用するように設計されていますか?
グラム++実装では、任意のアドレス値とstd::vector<T>::iterator
タイプのイテレータを構築するために、私のクライアントコードで私を可能にする:のstd ::ベクトル< T > ::イテレータ
int* i_ptr;
std::vector<int>::iterator it(i_ptr);
は、それが標準です能力、または実装の唯一の基盤ですか?
どこで使用するように設計されていますか?
これは単なる実装の詳細です。標準でコンパイルすることさえ保証されていません。また、gccの実装定義の動作やGNU C++の拡張機能にも記載されていないので、どのバージョンの変更でもスニペットが壊れる可能性があります。
あなたのコードでこの意味で「働く」ことに頼らないでください。 Visual Studioで
btw、標準のコンテナイテレータに対する要件が記述されています。 ? –
@GreenTree C++ 14標準の第23章またはcppreference.com前者はより形式的であり、後者は日常的な使用においてより有用です。 –
iirc Chandler Carruthは、libC++が実装定義の動作として 'T!= bool'のために' std :: vector
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>>> &'
これはコメントのようですが、回答ではありません) –
また、デバッグモードまたはリリースモードであるかどうかを指定する必要があります。 –
いいですね。これは[tag:language-lawyer]ではないので、コードをコンパイルしていない最近の主要なプラットフォームは、スニペットが移植可能な標準C++ではないことを示しています。 –
私はそれが標準機能であるとは思いません。実装定義の機能です。
多くの実装では、ベクトルイテレータは単純なポインタです。したがって、ベクトル< T>の場合、イテレータは単にTの型へのポインタです。いくつかの最適化のために行われます。そのような実装で
あなたがそのようなタイプの別のポインタでTを型へのポインタを初期化することができますので、Tを入力するポインタから初期化反復子を作成することが可能です。
もちろん、イテレータがTの型のポインタとして定義されている場合は、実装が定義されています。
この規格では必須機能として定義されていません。 実際、このような構造は 'friend'shipを介して' std :: vector'からのみアクセス可能な非公開でなければなりません。 標準では、それが起こるのを拒否することさえありません(おそらく、それは*欠陥*ですが誰かがそれを報告できるかもしれません) –