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

时间:2015-09-29 17:33:29

标签: c++ c++11 tuples auto

为什么语句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 1}}。

2 个答案:

答案 0 :(得分:2)

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

您可以使用for (auto& i: a)进行影响“原始”元组的更改。

答案 1 :(得分:2)

因为当你这样做时:

for (auto i: a)

您正在制作a中每个元素的副本。您将按值进行迭代并修改容器元素的本地副本。如果要实际修改容器的元素,则必须按引用进行迭代:

for (auto& i : a)
        ^^^

auto不会推断参考。