以下最小工作示例在使用选项 1 或选项 2 下的代码时编译,但在使用选项 3 下的代码时不编译。我假设emplace_back()
隐式使用/调用move
构造函数,那么为什么需要显式move()
?它与r-value
vs.有关系l-value
吗?或者这是否与std::unique_ptr
需要转让所有权有关?(我对这些概念还是陌生的,尤其是在这种情况下。)
为了完整起见,选项 4 withpush_back()
也不会编译,除非move()
被调用。
#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
的重复,即使链接问题的答案很有用,因为这是询问unique_ptr
在函数中定义 a 然后将其移动到成员vector
以便它不会在函数结束时被销毁,此外,emplace_back()
在这种情况下具体询问。
此外,我认为在这种情况下给出解释会很有用,因为有时很难将解释从一种情况翻译到另一种情况。谢谢!