2016-02-26 44 views
0

我有这样的代码:C++ 11右值引用与与指针与“正常”的成员引用

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,所以我不需要指针。但我应该考虑它们吗?

+1

在你的第一个例子中,对象被复制了。你需要'B(A && a):a(std :: move(a)){}'。 – aschepler

+0

当然。我将编辑 – Nick

+1

可能不是问题,但现在'B'外部的代码可以有效地修改'B'的状态(通过修改':: a')。这原本是不可能的。现在必须为'B :: a'的值在任何时候改变的可能性做好准备。 –

回答

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. 
} 
+0

我删除了复制构造函数,对象是不可复制的。但是无论如何物体是巨大的。问题是如果我转向引用成员,我应该期待什么? – Nick