我有一個類,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