gpt4 book ai didi

c++ - 移动构造函数和继承

转载 作者:IT老高 更新时间:2023-10-28 22:25:08 27 4
gpt4 key购买 nike

我试图了解移动构造函数和赋值操作在 C++11 中的工作方式,但我在委派给父类时遇到了问题。

代码:

class T0
{
public:
T0() { puts("ctor 0"); }
~T0() { puts("dtor 0"); }
T0(T0 const&) { puts("copy 0"); }
T0(T0&&) { puts("move 0"); }
T0& operator=(T0 const&) { puts("assign 0"); return *this; }
T0& operator=(T0&&) { puts("move assign 0"); return *this; }
};

class T : public T0
{
public:
T(): T0() { puts("ctor"); }
~T() { puts("dtor"); }
T(T const& o): T0(o) { puts("copy"); }
T(T&& o): T0(o) { puts("move"); }
T& operator=(T const& o) { puts("assign"); return static_cast<T&>(T0::operator=(o)); }
T& operator=(T&& o) { puts("move assign"); return static_cast<T&>(T0::operator=(o)); }
};

int main()
{
T t = std::move(T());
return 0;
}

但是,当我在VS2012下编译运行时,输出显示T0成员的左值版本被调用:

ctor 0
ctor
copy 0 <--
move <--
dtor
dtor 0
dtor
dtor 0

移动赋值也会发生类似的情况(测试用例略有不同)——T 的移动赋值运算符调用 T0 的“正常”赋值运算符。

我做错了什么?

最佳答案

将右值引用作为参数的函数更令人困惑的一点是,它们在内部将其参数视为左值。这是为了防止您在想要移动参数之前移动参数,但这需要一些时间来适应。为了实际移动参数,您必须在其上调用 std::move (或 std::forward)。所以你需要将你的移动构造函数定义为:

T(T&& o): T0(std::move(o)) { puts("move"); }

你的移动赋值运算符为:

T& operator=(T&& o) { puts("move assign"); return static_cast<T&>(T0::operator=(std::move(o))); }

关于c++ - 移动构造函数和继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15351341/

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