【发布时间】:2019-04-14 05:24:58
【问题描述】:
我对在 C++ 中移动语义并试图更好地理解它有点陌生。我遇到了一些代码,其中函数将右值转换为仅移动类型(unique_ptr)。所以我决定自己尝试一下。
我定义了一个函数,它将一个右值作为参数传递给一个 unique_ptr,如下所示:
void print(std::unique_ptr<Car>&& car)
{
std::cout << "Car" << car->Get() << std::endl;
}
Car 类是一个简单的类:
class Car
{
public:
Car(int i) : N(i) { std::cout << "Car" << N << std::endl; }
~Car() { std::cout << "~Car" << N << std::endl; }
int Get() { return N; }
private:
int N;
};
现在如果我这样调用函数:
std::unique_ptr<Car> car = std::make_unique<Car>(99);
print(std::move(car));
我发现调用 print() 函数后 car 对象没有被销毁。在这种情况下,强制转换为右值不会调用移动构造函数。
但是,如果我像这样更改函数定义:
void print(std::unique_ptr<Car> car)
{
std::cout << "Car" << car->Get() << std::endl;
}
那么调用 print() 后汽车对象不再有效。 print() 的参数是合适的 sink 参数。
这很有趣,因为我读过的所有内容都表明您应该期望一个对象在使用 std::move 后被销毁 - 即它的内部资源不再有效。
如果能得到更好的解释,我将不胜感激。
【问题讨论】: