gpt4 book ai didi

c++ - 在 C++11 中定义只移动对象是否有意义?

转载 作者:可可西里 更新时间:2023-11-01 17:50:23 24 4
gpt4 key购买 nike

我之前有一个关于使用 unique-ptrs 的问题。我得到 this answer建议使用只能移动的对象。我定义了一个类如下:

class B {
const string objName;
public:

B ( B && ) = default;
B & operator= ( B && ) = default;
B ( const B & ) = delete;
B & operator= ( const B & ) = delete;

B(const string & name) :
objName(name) {

}

virtual ~B();

const string name() const { return objName;};
}

然后我用这行代码给 B 打电话:

class A {
A(){}
void take(B b);
}

A a;
B b("test");
cout<<b.name();
a.take(std::move(b));
cout<<b.name();

我的问题:

  1. 即使我默认了移动构造函数,我也无法编写 a.take(b) 并且出现编译错误。我知道复制构造函数已被删除,但似乎合乎逻辑的选择是在默认情况下使用移动构造函数,而无需像这样编写 std::move a.take(b)
  2. 在结果中,“test”被打印了两次。为什么调用 move 后 b 对象没有被删除? 如果 b 对象仍然存在并且它的拷贝已发送到 a.take(move(b)) 那么这意味着我们没有任何对右值对象使用移动。
  3. 像上面那样使用仅移动对象(删除复制构造函数和赋值运算符并默认移动构造函数和移动赋值)是一个好习惯吗?

最佳答案

是的,有一点。第一个想到的例子是管理不能/不应该在对象之间共享的资源(可能是物理资源)的对象。

1) 你写错了。根据这个问题和您之前的问题,我认为您想要的是以下内容。

class B {
std::string objName;
public:
B ( B && ) = default;
B & operator= ( B && ) = default;
B ( const B & ) = delete;
B & operator= ( const B & ) = delete;
B(const std::string & name) :
objName(name) {}
virtual ~B() {}
std::string name() const { return objName;}
};

class A {
public:
std::vector<B> v;
void take(B && b)
{
v.push_back(std::move(b));
}
};

int main()
{
A a;
B b("test");

std::cout << "Before: " << b.name() << std::endl;
a.take(std::move(b));
std::cout << "After: " << b.name() << std::endl;

std::cout << "A has elements: " << std::endl;
for(B &b : a.v)
std::cout << " " << b.name() << std::endl;
}

2) 您正在访问一个已被移出的值,这没有任何意义! This answer已经做了很好的解释,但下面我还包含了来自 std::move 的 STL 引用的文本。

http://en.cppreference.com/w/cpp/utility/move

Unless otherwise specified, all standard library objects that have been moved from are placed in a valid but unspecified state. That is, only the functions without preconditions, such as the assignment operator, can be safely used on the object after it was moved from.

3) 根据我的经验,我发现了两种合法用途。在这两种情况下,只能移动的对象都控制着一个物理资源,如果由两个对象共享,这将破坏一切。

关于c++ - 在 C++11 中定义只移动对象是否有意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33316942/

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