다음 최소 작업 예제는 옵션 1 또는 옵션 2의 코드를 사용할 때 컴파일되지만 옵션 3의 코드를 사용하면 이 아닌이 컴파일됩니다. emplace_back()
은 move
생성자를 암묵적으로 사용/호출한다는 가정하에 명시적인 move()
이 필요한 이유는 무엇입니까? r-value
대 l-value
과 관련이 있습니까? 또는 소유권을 이전해야하는 std::unique_ptr
과 관련이 있습니까? (특히이 컨셉을 처음 접했을 때입니다.)이 예제에서 emplace_back으로 이동이 필요한 이유는 무엇입니까?
move()
을 호출하지 않으면 push_back()
의 옵션 4도 컴파일되지 않습니다.
#include <iostream>
#include <vector>
#include <memory>
class Beta {
public:
Beta(int x, int y, int z): mX(x), mY(y), mZ(z) { };
int mX; int mY; int mZ;
};
class Alpha {
public:
std::vector<std::unique_ptr<Beta>> betaVec;
void addBeta(int x, int y, int z) {
// only choose one of the following options:
// option 1 (compiles)
std::unique_ptr<Beta> pBeta = std::make_unique<Beta>(x, y, z);
betaVec.emplace_back(move(pBeta));
// option 2 (compiles)
betaVec.emplace_back(std::make_unique<Beta>(x, y, z));
// option 3 (does not compile)
std::unique_ptr<Beta> pBeta = std::make_unique<Beta>(x, y, z);
betaVec.emplace_back(pBeta);
// option 4 (does not compile)
std::unique_ptr<Beta> pBeta = std::make_unique<Beta>(x, y, z);
betaVec.push_back(pBeta);
// option 5 (compiles)
std::unique_ptr<Beta> pBeta = std::make_unique<Beta>(x, y, z);
betaVec.push_back(move(pBeta));
}
};
int main() {
return 0;
}
참고 : 나는이 링크 된 질문에 대한 답변이 유용하다하더라도, 기능에 unique_ptr
매개 변수를 전달하는 방법에 대한 this question의 중복이라고 생각하지 않는다,이 같은 정의에 대한 요구하고있다 unique_ptr
내에서 함수를 호출 한 다음 함수를 끝내면서 파괴되지 않도록 vector
멤버로 이동하고이 컨텍스트에서 emplace_back()
을 구체적으로 묻습니다.
또한이 컨텍스트에서 설명을 번역하는 것이 때때로 어렵 기 때문에이 컨텍스트에서 설명하는 것이 유용 할 것이라고 생각합니다. 고맙습니다!
나중에 참조 할 수 있도록 유용하고 관련있는 질문입니다. https://stackoverflow.com/questions/29089227/push-back-or-emplacle-back-with-stdmake-unique 및 https://stackoverflow.com/ 질문/35404932/stdvectoremplace-back-and-stdmove. – PhysicsCodingEnthusiast