次のクラスのテスト メソッドには、期待した効果がありません。emplace_back の呼び出しが添え字を介して取得した参照を何らかの形で無効にするという事実と関係があるのではないかと私は疑っています。
いずれにせよ、テスト中の2番目の印刷が次のようになると予想します
v[0] = 1
ただし、両方の結果
v[0] = 5
割り当てが行われないことを示唆しています。
class FooBar {
vector<size_t> v;
public:
size_t add(size_t x) {
cout << "add(" << x << ")" << endl;
size_t K(v.size());
v.emplace_back(x);
return K;
}
void test(size_t idx) {
cout << "v[" << idx << "] = " << v[idx] << endl;
v[idx] = add(0);
cout << "v[" << idx << "] = " << v[idx]<< endl;
}
};
int main(int argc, char* argv[])
{
FooBar f;
f.add(5);
f.test(0);
}
add の結果を一時的に保存して割り当てを実行することで問題を回避できることはわかっていますが、単純な割り当てだけを使用できない理由と、試行時にエラーが発生しない理由に興味があります。これを実行します。
MSVC (Visual Studio 2015) でコンパイルおよびテストされています。