何はstd ::ベクトルは::()が呼び出され始めるが、返されたイテレータを基準に割り当てられている場合はどうなりますか?なぜ動作し、反復子の値はどこに格納されていますか?オートリファレンスとイテレータ
std::vector<int> v;
auto a = v.begin(); //I assume iterator is stored on the stack in variable "a".
auto& b = v.begin(); //What happens here?
何はstd ::ベクトルは::()が呼び出され始めるが、返されたイテレータを基準に割り当てられている場合はどうなりますか?なぜ動作し、反復子の値はどこに格納されていますか?オートリファレンスとイテレータ
std::vector<int> v;
auto a = v.begin(); //I assume iterator is stored on the stack in variable "a".
auto& b = v.begin(); //What happens here?
このライン
auto& b = v.begin();
は、エラーです。
を書いたかのように++はCにあるため、その危険な「拡張子」のマイクロソフトのコンパイラでコンパイル可能性がある、それを処理し、喜んでエラーを受け入れるDieterLückingMicrosoftのコンパイラ@ –
@RichardHodges:良い点。私は言葉を "コンパイルエラー"から "エラー"に変更しました。 –
はい、Microsoftコンパイラで動作し、正しい行と同じアセンブリコードを作成します。混乱する。私はコンパイラエラーを優先していたでしょう。 – Tom
ここではありません。あなたは、ぶら下がっている参照があります。これをしないでください。 Visual Studioの特定のバージョンは、あなたがconst auto&
と程度の一時的な生涯を書いたことをふりますけれども
ほとんどのコンパイラは、これを拒否します。その一時的な情報が保存される場所は無関係です。 v.begin()が一時的に戻って、あなたは非const参照に一時的にバインドすることはできませんので
なぜ試してみませんか?あなたが自動&& B –
を(コンパイラはあなたに叫ぶ必要があります)。 –