我有一个类,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
吨,包含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
实例,而不是引用,可以摆脱该错误,但我不明白为什么 - 我测试并验证了,只要您提供了参考成员就可以使用参考成员移动构造对象自己的移动构造函数,那么交易是什么?
@MooingDuck:我看不出如何回答这个问题。我很确定这是MSVC中的一个错误。 – 2013-05-01 00:03:47
@JesseGood:[哦你是对的](http://coliru.stacked-crooked.com/),我误解了部分代码。然后它是[我的这个错误报告](https://connect.microsoft。com/VisualStudio/feedback/details/778513/msvc10-using-copy-constructor-instead-of-move):P – 2013-05-01 00:15:05
上述类的*声明*被分解为只包含可重复的结果特别是'PlayerMoveComponent' – WhozCraig 2013-05-01 00:25:40