回答:
vector<vector<int>>{{77, 777, 7777}}一時的なものでありvector<vector<int>>{{77, 777, 7777}}[0]、ranged-forでの使用は未定義の動作になります。
最初に、次のように変数を作成する必要があります
#include <iostream>
#include <vector>
using namespace std;
int main()
{
auto v = vector<vector<int>>{{77, 777, 7777}};
for(int i: v[0])
cout << i << ' ';
}
また、Clang 10.0.0を使用すると、この動作に関する警告が表示されます。
警告:ポインターを支えるオブジェクトは、完全式の最後で破棄されます[-Wdangling-gsl] vector> {{77、777、7777}} [0]
これは、繰り返し処理するベクトルがループに入る前に破棄されるためです。
これは通常起こることです:
auto&& range = vector<vector<int>>{{77, 777, 7777}}[0];
auto&& first = std::begin(range);
auto&& last = std::end(range);
for(; first != last; ++first)
{
int i = *first;
// the rest of the loop
}
次のように評価されるため、問題は最初の行から始まります。
最初に、指定された引数を使用してベクトルのベクトルを作成します。名前がないため、そのベクトルは一時的なものになります。
次に、範囲参照は、それを含むベクトルが有効である限りのみ有効になる添え字付きベクトルにバインドされます。
セミコロンに到達すると、一時的なベクトルが破棄され、そのデストラクタで、添え字付きのベクトルを含む格納されたすべてのベクトルが破棄され、割り当てが解除されます。
あなたは、繰り返される破壊されたベクトルへの参照で終わります。
この問題を回避するには、2つの解決策があります。
ループの前にベクトルを宣言して、ループを含むスコープが終了するまで継続するようにします。
C ++ 20には、これらの問題を解決するために提供されるinitステートメントが付属しており、ループの直後にベクトルを破棄する場合は、最初のアプローチよりも優れています。
for (vector<vector<int>> vec{{77, 777, 7777}}; int i : vec[0])
{
}
using std::vector代わりに使用してくださいusing namespace std;。