【发布时间】:2018-04-29 01:22:36
【问题描述】:
以下最小工作示例在使用选项 1 或选项 2 下的代码时编译,但在使用选项 3 下的代码时不编译。我假设emplace_back() 隐式使用/调用move 构造函数,那么为什么需要显式move()?它与r-value 和l-value 有什么关系吗?或者这与std::unique_ptr 需要转让所有权有关吗? (我对这些概念还是陌生的,尤其是在这种情况下。)
为了完整起见,带有push_back() 的选项4 也不会编译,除非调用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;
}
注意:我不认为这是 this question 关于将 unique_ptr 参数传递给函数的重复,即使链接问题的答案很有用,因为这是在询问定义一个unique_ptr within 一个函数,然后将它移动到一个成员vector,这样它就不会在函数结束时被破坏,此外,在这个函数中专门询问emplace_back()上下文。
此外,我认为在这种情况下给出解释会很有用,因为有时很难将解释从一种情况翻译到另一种情况。谢谢!
【问题讨论】:
-
为了将来参考,这些是有用且相关的问题:stackoverflow.com/questions/29089227/… 和 stackoverflow.com/questions/35404932/…。
标签: c++ vector move-semantics unique-ptr emplace