std :: vector <Foo>当Foo的某些成员是引用时

Bor*_*ein 6 c++ stdvector move-semantics c++11

我经常更喜欢尽可能使用引用而不是指针,这使我的语法清晰.在这种情况下,我有一个类:

class Foo
{
public:
    Foo(Bar & bar) : bar_(bar) {}

private:
    Bar & bar_;
};
Run Code Online (Sandbox Code Playgroud)

operator=() 编译器为这样的类隐含地删除了,因为一旦设置了引用,它就无法更改(我可以在技术上定义我自己的不会改变bar_,但这不是必需的行为,所以我宁愿如果我尝试分配foo,编译器会抱怨.

我需要的是一个std::vector<Foo> v;.这在C++ 11之前是不可能的,因为模板参数必须是CopyAssignable.实际上,当我打电话时v.push_back(Foo(bar));,编译器会抱怨.但我觉得自C++ 11和Move语义以来可能是可能的.

我的问题是:是否有使用C++ 11的解决方法可以使构建这样的向量成为可能,或者我是否陷入这种情况并无法使用指针而不是引用?如果有一个解决方法,我非常感谢代码片段,因为我不熟悉移动语义.

aar*_*man 6

emplace_back由于完美的转发,Voila 能够胜任这项工作.

#include <vector>                                                                  

class Bar{};                                                                       
class Foo                                                                          
{                                                                                  
public:                                                                            
    Foo(Bar & bar) : bar_(bar) {}                                                  

private:                                                                           
    Bar & bar_;                                                                    
};                                                                                 
using namespace std;                                                               
int main() {                                                                       
    vector<Foo> v;                                                                 
    Bar bar;
    v.emplace_back(bar);                                                     
} 
Run Code Online (Sandbox Code Playgroud)

您还可以通过自身在容器中存储的参考与std::reference_wrapper使用像std::vector<std::reference_wrapper<int>> v