只要有可能,我通常更喜欢使用引用而不是指针,在我看来,它使语法更清晰。在这种情况下,我有一堂课:
class Foo
{
public:
Foo(Bar & bar) : bar_(bar) {}
private:
Bar & bar_;
};
operator=()
对于这样的类,编译器会隐式删除它,因为一旦设置了引用,就无法更改它(从技术上讲,我可以定义自己的不会更改 bar_ 的行为,但这不是所需的行为,所以我宁愿如果我尝试分配 foo,编译器会抱怨)。
我需要的是一个std::vector<Foo> v;
。这在 C++11 之前是不可能的,因为模板参数必须是可复制分配的。确实,当我打电话时v.push_back(Foo(bar));
,编译器抱怨。但我觉得自从 C++11 和 Move 语义以来这是可能的。
我的问题是:是否有使用 C++11 的解决方法可以构建这样的向量,或者我是否陷入这种情况并且无法使用指针而不是引用?如果有解决方法,我将非常感谢代码片段,因为我不熟悉移动语义。
Voila emplace_back http://en.cppreference.com/w/cpp/container/vector/emplace_back之所以能够完成这项工作,是因为完美的转发。
#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);
}
您还可以将引用本身存储在容器中std::reference_wrapper http://en.cppreference.com/w/cpp/utility/functional/reference_wrapper像这样使用std::vector<std::reference_wrapper<int>> v
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)