我有一堂课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
作为参数传递的 a 对其进行初始化。它的构造函数:
PlayerMoveComponent::PlayerMoveComponent(/* other parameters */ std::unique_ptr<IRawInputConverter> inputConverter) :
//other initializations
inputComponent(PlayerInputComponent(*this, std::move(inputConverter)))
{
}
我为该类定义了自己的移动构造函数,PlayerInputComponent
因为我的理解是不会为包含引用成员的类构造默认移动构造函数。在这种情况下,虽然我知道引用将在PlayerInputComponent
对象的生命周期内保持在范围内。
由于我正在从临时初始化PlayerMoveComponent
'sinputComponent
变量,因此我相信应该发生以下两件事之一:
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
实例而不是引用可以消除错误,但我不明白为什么-我已经测试并验证了只要您提供自己的移动构造函数,使用引用成员构建对象的移动就可以工作,那么有什么关系呢?