나는 현재 C를 배우고 ++ 하나는 내가에 대한 혼란 스러워요하는 하나의 표준에 대한 이동 생성자를 트리거하는 것입니다이동 구문을 트리거하는 생성자는 무엇입니까?
//Code might be incorrect since I havent tested it out
Xyt::ByteArray* Xyt::ResourceManager::LoadFileToByteArray(std::string Path)
{
try {
std::ifstream FileStream(Path, std::ios::in);
std::ifstream::pos_type Pos = FileStream.tellg();
FileStream.seekg(0, std::ios::beg);
std::vector<char> Buff(Pos);
FileStream.read(Buff.data(), Pos);
FileStream.close();
//I want to trigger the move constructor here
return new Xyt::ByteArray(std::move(Buff));
}
catch (std::exception e) {
std::cout << "ERROR::FILE::FILE_NOT_SUCCESFULLY_READ" << Path << std::endl;
return nullptr;
}
}
이동 :: 표준을 사용하는 올바른 방법 인 어느 대해 궁금해 :: 벡터? 그것은이 하나
Xyt::ByteArray::ByteArray(std::vector<char>&& Buffer)
{
this->Buffer = Buffer;
}
이 하나 (둘 다 표준 : 이동 (버프)와 버프를 받아) (발신자 나던 사용 표준 : 이동 때 오류를 컴파일)
인가?
Xyt::ByteArray::ByteArray(std::vector<char> Buffer)
{
this->Buffer = Buffer;
}
또는이 하나?
Xyt::ByteArray::ByteArray(std::vector<char> Buffer)
{
this->Buffer = std::move(Buffer);
}
제 1 생성자가 이동 의미 체계를 사용하는 올바른 방법이라는 것을 인터넷을 통해 알게되었습니다. 하지만 첫 번째 생성자를 사용하면 실제로 std :: vector Buff에 복사본을 만들려면 다른 생성자를 만들어야한다는 뜻인가요?
도움이 될 것입니다.
알겠습니다. 그래도 한가지 더, Xyt :: ByteArray :: ByteArray (std :: vector && 버퍼) { this-> Buffer = std :: move (Buffer); }, 만약 std :: move가 이렇게하면 세 번째 생성자와 비슷한 두 번 move 생성자를 호출할까요? –
Xyten
@Xyten : 아니요. 이동 * 생성자 *를 전혀 호출하지 않습니다. 'ByteArray :: Buffer'는 그 시점에서 * 살아있는 객체이므로 move * assignment *를 호출 할 것입니다. 그래서 멤버 초기화 프로그램을 사용했습니다. 여기에 멤버의 초기화 *를 넣습니다. –