![](/img/trans.png)
[英]Why does compiler use move constructor instead of the copy constructor
[英]Why does this call the copy constructor, not the move constructor?
我有一个类, PlayerInputComponent
:
。H:
class PlayerInputComponent
{
public:
PlayerInputComponent(PlayerMoveComponent& parentMoveComponent_, std::unique_ptr<IRawInputConverter> inputConverter_);
PlayerInputComponent(PlayerInputComponent&& moveFrom);
void update();
private:
std::unique_ptr<IRawInputConverter> inputConverter;
PlayerMoveComponent& parentMoveComponent;
};
}
的.cpp:
PlayerInputComponent::PlayerInputComponent(PlayerMoveComponent& parentMoveComponent_, std::unique_ptr<IRawInputConverter> inputConverter_) :
parentMoveComponent(parentMoveComponent_),
inputConverter(std::move(inputConverter_))
{
}
PlayerInputComponent::PlayerInputComponent(PlayerInputComponent&& moveFrom) :
parentMoveComponent(moveFrom.parentMoveComponent),
inputConverter(moveFrom.inputConverter.release())
{
}
和一个类PlayerMoveComponen
t,它包含一个PlayerInputComponent
成员,并使用作为参数传递的std::unique_ptr
对其进行初始化。 它的构造函数:
PlayerMoveComponent::PlayerMoveComponent(/* other parameters */ std::unique_ptr<IRawInputConverter> inputConverter) :
//other initializations
inputComponent(PlayerInputComponent(*this, std::move(inputConverter)))
{
}
我为PlayerInputComponent
类定义了自己的移动构造函数,因为我的理解是不会为包含引用成员的类构造默认移动构造函数。 在这种情况下,虽然我知道引用将保留在PlayerInputComponent
对象的生存期的持续时间范围内。
由于我是从临时初始化PlayerMoveComponent
的inputComponent
变量,我相信应该发生以下两件事之一:
PlayerInputComponent
的移动构造函数用于初始化playerInputComponent
成员变量。 但是,Visual Studio 2012吐出了这个:
error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<_Ty>'
1> with
1> [
1> _Ty=SDLGame::IRawInputConverter
1> ]
1> c:\program files\microsoft visual studio 11.0\vc\include\memory(1447) : see declaration of 'std::unique_ptr<_Ty>::unique_ptr'
1> with
1> [
1> _Ty=SDLGame::IRawInputConverter
1> ]
1> This diagnostic occurred in the compiler generated function 'PlayerInputComponent::PlayerInputComponent(const PlayerInputComponent &)'
为什么在这里调用复制构造函数? 使PlayerInputComponent
类的parentMoveComponent
成员成为一个常规的ParentMoveComponent
实例,而不是一个引用,摆脱了错误,但我不明白为什么 - 我已经测试并验证,只要你提供你的参考成员就可以移动构建对象自己的移动构造函数,那么交易是什么?
如果这不能真正回答你的问题,我很抱歉,我只是想对你问题的明显复杂性做出反应。 如果可以的话,这不会简单一千倍:
/******************** ********** ********************/
class C {};
class B;
class A
{
public:
A(): _b(nullptr), _c(nullptr) {}
A( B *b, C *c ): _b(b), _c(c) {}
A( A&& a ): _b(a._b), _c(a._c) {}
private:
C *_c;
B *_b;
};
class B
{
public:
B( /* other parameters */ C *c ): _a( A(this,c) ) {}
private:
A _a;
};
/******************** ********** ********************/
int main()
{
C c;
B b(&c);
}
并实现同样的目标? 我没有反对使用c ++ 11中的新功能,比如std::unique_ptr
,但恕我直言,确保指针永远不能从两个地方取消引用不应该是运行时检查的问题(除非非常罕见)案例),但设计问题..不应该吗?
如果使用=
初始化新Object,则默认情况下将触发复制构造函数。 要触发移动构造函数,您需要更改operator=
的行为。您可以在此处找到示例希望我帮助过您。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.