下面这个类的测试方法没有达到我所期望的效果。我怀疑这与emplace_back的调用以某种方式使通过下标获得的引用无效的事实有关。
无论哪种方式,我都希望test中的第二次打印结果是
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)编译并测试。
v[idx] = add(0);
是未定义行为的原因。您正在修改add
中v
的内容,同时假设v[idx]
将有效。
void test(size_t idx) {
cout << "v[" << idx << "] = " << v[idx] << endl;
size_t val = add(0);
v[idx] = val;
cout << "v[" << idx << "] = " << v[idx]<< endl;
}