【问题标题】:C++11 rvalue references vs references vs pointers vs "normal" membersC++11 右值引用 vs 引用 vs 指针 vs “普通”成员
【发布时间】:2016-06-10 06:23:37
【问题描述】:

我有这样的代码:

class A{
};

class B{
   B(A &&a) : a(std::move(a)){};
   A a;
}

A a{};
B b{ std::move(a) };
// a is unusable

我使用右值,因为我不希望对象被复制。

我正在考虑将 class B 更改为使用引用:

class A{
};

class B{
   B(A &a) : a(a){};
   A &a;
}

A a{};
B b{ a };
// a is usable

除了实时问题外,这会产生任何负面影响吗?我没有重新分配a object,所以我不需要指针。但我应该考虑他们吗?

【问题讨论】:

  • 在您的第一个示例中,对象无论如何都会被复制。你需要B(A &&a) : a(std::move(a)) {}
  • 可能是也可能不是问题,但现在B 外部的代码可以有效地修改B 的状态(通过修改::a)。这原本是不可能的。 B 现在必须为B::a 的值随时变化的可能性做好准备。
  • 另一个结果是不再生成隐式声明的 c-tors

标签: class pointers c++11 reference rvalue-reference


【解决方案1】:

为什么不让调用者决定是移动还是复制其A 对象?

class A {};

class B {
public:
    B(A a_param) : a(std::move(a_param)) {}
private:
    A a;
};

void f1() {
    A a;
    B b{a}; // Makes a copy, a is still usable.
}

void f2() {
    A a;
    B b{std::move(a)}; // Does a move, a is not usable.
}

void f3() {
    B b{A{}}; // Does a move of the temporary object.
}

【讨论】:

  • 我删除了复制构造函数,对象是不可复制的。但无论如何,物体都是巨大的。问题是如果我转向参考成员,我应该期待什么?
猜你喜欢
  • 1970-01-01
  • 2011-01-19
  • 1970-01-01
  • 2012-04-19
  • 1970-01-01
  • 1970-01-01
  • 2011-05-14
  • 2020-04-28
相关资源
最近更新 更多