2015-10-17 32 views

回答

2

不,除非你有一個std::reference_wrapper<std::list>的矢量,即reference wrapper圍繞std::listpush_back複製該值(或移動右值)。請注意,您不能擁有一個純引用的容器,這就是爲什麼您需要std::reference_wrapper以防您想要「模擬」將容器中的引用回推。

代碼下面的例子:

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

template<typename T> 
void display(T const& container) 
{ 
    for (auto && elem : container) 
    { 
     for (auto && i : elem) 
     { 
      std::cout << i << " "; 
     } 
     std::cout << std::endl; 
    } 
} 

template<typename T> 
void display_ref(T const& container) 
{ 
    for (auto && elem : container) 
    { 
     for (auto && i : elem.get()) 
     { 
      std::cout << i << " "; 
     } 
     std::cout << std::endl; 
    } 
} 

int main() 
{ 
    std::vector<std::list<int>> v1; 
    std::vector<std::reference_wrapper<std::list<int>>> v2; 

    std::list<int> l{1, 2, 3}; 

    v1.push_back(l); 
    v2.push_back(l); 

    // modify l 
    l.front() = 42; 

    // display 
    display(v1); // unchanged 
    display_ref(v2); // changed 
} 

Live on Coliru

+0

完美答案;說得通。 –

0

一個std::vector讓你分配給它的元素是什麼的副本。因此,在將新值添加到最初分配給矢量的外部列表中時,vector[0]中的列表不會更改。