gpt4 book ai didi

c++ - 如何使右值方法正确调用 move 构造函数

转载 作者:搜寻专家 更新时间:2023-10-31 01:32:29 25 4
gpt4 key购买 nike

我有这样的复制和 move 构造函数的基类:

class Test {
public:
Test( int i ) {
iptr = new int( i );
}
Test( const Test & other ) {
printf("copy constructor\n");
iptr = new int( *other.iptr );
}
Test( Test && other ) {
printf("move constructor\n");
iptr = other.iptr;
other.iptr = NULL;
}
virtual ~Test() {
delete iptr;
}
virtual Test * copy() {
return new Test( *this );
}
virtual Test * move() && {
return new Test( *this );
}
protected:
int * iptr;
};

我添加了复制和 move 方法以允许从指针多态复制和 move 对象,这可能指向某个子类的实例。

但是当我写下面的内容时

Test t1( 5 );
Test * t2 = t1.copy();
Test * t3 = Test( 6 ).move();

第一种情况正确调用了复制构造函数,但第二种情况也错误地调用了复制构造函数。

为什么构造函数重载不能正常工作,我如何让它调用 move 构造函数?

最佳答案

以同样的方式,任何右值引用参数都是函数内的左值,调用右值引用限定成员函数的对象是该成员函数内的左值。

void foo(Test&& x) 
{
/* here x is an lvalue ! */
Test y(std::move(x)); // need explicit cast to actually move
}

因此你需要:

virtual Test * move() && {
return new Test( std::move(*this) );
}

(不要忘记 #include <utility> 。)

为什么*this的原因是一个左值是因为指针间接总是产生一个左值,其中 this始终是 T* (或 T cv * )在 T 类型的成员函数中.而成员函数 cv 限定会影响 this指针,函数的 ref 限定没有。 (没有“指向右值的指针”或“指向左值的指针”,只有“指向 const 的指针”或“指向 volatile 的指针”等)


关于c++ - 如何使右值方法正确调用 move 构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43167503/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com