首页 > 解决方案 > 打印 reference_wrapper 的向量

问题描述

我有以下可在 clang 下运行的测试代码。

#include <algorithm>
#include <vector>
#include <iostream>

int main() {

    std::vector<int> vs{1, 2, 4, 5};

    std::vector<std::reference_wrapper<int>> vs1;

    for (int i : vs) {
        std::cout << "loop: " << i << std::endl;
        vs1.emplace_back(i);
    }

    for (auto p : vs1) {
        std::cout << p << std::endl;
    }
    return 0;
}

您可以将其插入https://rextester.com/l/cpp_online_compiler_clang(或本地)。结果是:

loop: 1
loop: 2
loop: 4
loop: 5
5
5
5
5
  1. 我希望是 1,2,4,5,而不是 5。
  2. 该代码不适用于非clang。问题出在哪里?

标签: c++clang

解决方案


i是其声明循环内的局部变量。for它是向量中每个的副本。因此,您(通过调用)创建引用局部变量的对象,在被引用变量 ( ) 的生命周期结束后保持引用活动。这是未定义的行为intvsemplace_back()reference_wrapperi

解决方法是i引用eachint而不是copy,这样s按预期reference_wrapper引用ints :vs

for (int& i : vs)

推荐阅读