【发布时间】:2013-11-17 02:11:01
【问题描述】:
我通常更喜欢使用引用而不是指针,我认为它使语法更清晰。在这种情况下,我有一个类:
class Foo
{
public:
Foo(Bar & bar) : bar_(bar) {}
private:
Bar & bar_;
};
operator=() 被编译器隐式删除,因为一旦设置了引用,它就无法更改(我可以在技术上定义我自己的不会更改 bar_,但这不是必需的行为,所以如果我尝试分配一个 foo,我宁愿编译器抱怨)。
我需要的是std::vector<Foo> v;。这在 C++11 之前是不可能的,因为模板参数必须是 CopyAssignable。事实上,当我调用v.push_back(Foo(bar)); 时,编译器会抱怨。但我觉得从 C++11 和 Move 语义开始就有可能。
我的问题是:是否有使用 C++11 的解决方法可以构建这样的向量,或者我是否陷入这种情况并且无法使用指针而不是引用?如果有解决方法,我非常感谢代码 sn-p,因为我不熟悉移动语义。
【问题讨论】:
-
我认为 emplace back 是你要找的
-
Foo(const Foo && foo) : bar_(foo.bar_) {}不能解决这个问题吗? -
我确信,根据您的类如何定义其构造函数,
push_back可以使用隐式移动生成正常工作。你的例子对我来说编译得很好吗? -
您需要
std::optional或boost::optional。它们都具有指针的大小。boost::optional< T & >/boost::optional< T const & >具有所需的语义。
标签: c++ c++11 stdvector move-semantics