[c++] 為什麼我無法製作引用向量?



Answers

是的,你可以,尋找std::reference_wrapper ,模仿引用,但是可分配的,也可以“重新設置”

Question

當我這樣做時:

std::vector<int> hello;

一切都很好。 但是,當我將它作為引用的向量時:

std::vector<int &> hello;

我得到可怕的錯誤,如“錯誤C2528:'指針':引用指針是非法的”。

我想把一堆引用結構體放到一個向量中,這樣我就不必介入指針了。 為什麼矢量會對此發脾氣? 我唯一的選擇是使用指針向量嗎?




正如其他評論所暗示的,你只能使用指針。 但如果有幫助,這裡有一種避免直接面對指針的技術。

你可以做如下的事情:

vector<int*> iarray;
int default_item = 0; // for handling out-of-range exception

int& get_item_as_ref(unsigned int idx) {
   // handling out-of-range exception
   if(idx >= iarray.size()) 
      return default_item;
   return reinterpret_cast<int&>(*iarray[idx]);
}



這是C ++語言的一個缺陷。 你不能獲取引用的地址,因為嘗試這樣做會導致被引用對象的地址,因此你永遠不會得到指向引用的指針。 std::vector使用指向其元素的指針,所以被存儲的值需要能夠被指向。 你將不得不使用指針。




Ion Todirel已經提到了使用std::reference_wrapper的答案YES由於C ++ 11,我們有一種機制可以從std::vector檢索對象,並使用std::remove_reference刪除引用。 下面給出一個使用g++clang選項編譯的例子
-std=c++11並成功執行。

#include <iostream>
#include <vector>
#include<functional>

class MyClass {
public:
    void func() {
        std::cout << "I am func \n";
    }

    MyClass(int y) : x(y) {}

    int getval()
    {
        return x;
    }

private: 
        int x;
};

int main() {
    std::vector<std::reference_wrapper<MyClass>> vec;

    MyClass obj1(2);
    MyClass obj2(3);

    MyClass& obj_ref1 = std::ref(obj1);
    MyClass& obj_ref2 = obj2;

    vec.push_back(obj_ref1);
    vec.push_back(obj_ref2);

    for (auto obj3 : vec)
    {
        std::remove_reference<MyClass&>::type(obj3).func();      
        std::cout << std::remove_reference<MyClass&>::type(obj3).getval() << "\n";
    }             
}



Related



Tags

c++ c++   stl   vector