为什么我的代码中 get<>() 分配的值会在构造之外发生变化?

Why does the value assigned by get<>() in my code change outside the construct?

为什么语句 2 的输出与语句 1 的输出不同?

// a is of type vector < tuple <int, int> >

for (auto i: a)
{
    get<0>(i)+=get<1>(i);                                       
    cout << get<0>(i) << " " << get<1>(i) << endl;              // 1
}

for (auto i: a) cout << get<0>(i) << " " << get<1>(i) << endl;  // 2

假设最初,a包含[7, 3] , [9, 1]

然后1输出

10 3
10 1

2 输出

7 3
9 1

简而言之,循环封闭语句1似乎没有效果。

我觉得和我使用auto没有使用*i改变值有关系,但是我觉得我们不能在里面使用*i get.

是的,您的怀疑是正确的,在 for (auto i: a)i 包含元组的副本。任何更改仅影响副本。

您可以使用 for (auto& i: a) 进行影响 "original" 元组的更改。

因为当你这样做时:

for (auto i: a)

您正在为 a 中的每个元素制作 副本 。您正在按值迭代并修改容器元素的本地副本。如果你想真正修改容器的元素,你必须通过引用迭代:

for (auto& i : a)
        ^^^

auto不推导引用。