我试图在C++中使用引用包装器,因为我希望能够直接更改对象的值,但是它们的值都是错误的。这是一个演示此问题的示例:
#include <vector>
#include <functional>
#include <iostream>
using namespace std;
int main() {
vector<int> v1 = {1, 2, 3};
for (int i : v1) {
cout << i << " ";
}
cout << endl;
vector<reference_wrapper<int>> v2;
for (int i : v1) {
v2.push_back(i);
}
for (int i : v2) {
cout << i << " ";
}
}
它打印
1 2 3
3 3 3
我不确定为什么引用包装器 vector
v2
不复制v1
中的引用值...编辑:这是另一个示例,它也神秘地不起作用。我认为这其中没有任何悬而未决的引用文献。
#include <vector>
#include <functional>
#include <iostream>
using namespace std;
int main() {
vector<int> v1;
vector<reference_wrapper<int>> v2;
for (int i = 0; i < 3; i++) {
v1.push_back(i);
v2.push_back(v1[i]);
}
for (int i : v2) {
cout << i << " ";
}
}
它会打印
9596312 1 2
,而我希望它会打印0 1 2
...
最佳答案
在for
循环中
for (int i : v1) {
v2.push_back(i);
}
您正在从局部变量
reference_wrapper
构造i
,该变量在迭代后立即销毁,因此存储在reference_wrapper
中的v2
悬挂了。对它们的取消引用导致undefined behavior。您应该声明
i
作为引用为for (int& i : v1) {
v2.push_back(i);
}
LIVE
在进行编辑时,请注意
std::vector::push_back
可能会导致对v1
进行重新分配,这会使存储在v2
中的引用指向v1
的元素而悬空。您可以预先使用
reserve
以避免重新分配。例如vector<int> v1;
v1.reserve(3);
vector<reference_wrapper<int>> v2;
for (int i = 0; i < 3; i++) {
v1.push_back(i);
v2.push_back(v1[i]);
}
LIVE
关于c++ - C++ reference_wrapper vector 使用错误的值填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60751377/