将vector元素分配给调用emplace_back的函数结果?

时间:2015-10-22 18:47:43

标签: c++ vector emplace

以下类的测试方法没有我期望的效果。我怀疑它与emplace_back的调用以某种方式使通过下标获得的引用无效这一事实有关。

无论哪种方式,我都希望测试中的第二次打印产生

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)。

1 个答案:

答案 0 :(得分:3)

该行

    v[idx] = add(0);

导致未定义的行为。您正在修改vadd的内容,同时假设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;
}