Почему я не могу использовать ссылочные типы в качестве типа значения типа контейнера? - PullRequest
7 голосов
/ 18 октября 2010

Например, std::vector<int&> vec_int; это кажется недопустимым в c ++. Почему это недействительно?

Ответы [ 3 ]

9 голосов
/ 18 октября 2010

Контейнеры STL должны иметь возможность конструировать объекты с помощью конструктора по умолчанию.Вы не можете сделать это со ссылкой.Ссылка гарантированно действительна, поэтому она всегда должна быть инициализирована с присваиванием.

Вместо нее необходимо использовать указатель.

3 голосов
/ 19 октября 2010

Ответ в соответствии с запросом chryspi выше. Как отмечено в других ответах, вы не можете использовать ссылки напрямую, поскольку ссылки не существуют сами по себе.

Однако вы можете использовать ссылки, но с помощью служебного класса boost::reference_wrapper<T>:

    typedef boost::reference_wrapper<int> intref;
    std::vector<intref> v;
    int i;
    i = 9;

    v.push_back (boost::ref (i));  // store &i

    int& j = v[0];
    j = 10;
    //v[0].get() = 10;

    std::cout << i << std::endl; // prints 10

Я привожу в качестве примера, как изменить непосредственно элемент v[0]. Обратите внимание, что это несколько сложно (вы должны вызвать метод get()), потому что вы получаете boost::reference_wrapper<T> вместо фактической ссылки.

Для безопасного хранения указателей относительно памяти вы можете использовать boost::shared_ptr аналогичным образом.

3 голосов
/ 18 октября 2010

Внутренне vector<T> использует массив для хранения последовательности T объектов.Поскольку ссылки не являются объектами, не существует такого понятия, как массив ссылок (см. П. 8.3.2 в стандарте), поэтому ссылочные типы нельзя использовать для параметризации шаблона vector.

Чтовам, вероятно, нужен вектор интеллектуальных указателей, таких как std::vector<boost::shared_ptr<T> >, или выделенный контейнер указателей, например, boost::ptr_vector<T>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...