gpt4 book ai didi

c++ - 为什么 std::copyable 包含 std::movable ?

转载 作者:行者123 更新时间:2023-12-01 12:46:26 25 4
gpt4 key购买 nike

根据 cppreference , std::copyable定义如下:

template <class T>
concept copyable =
std::copy_constructible<T> &&
std::movable<T> && // <-- !!
std::assignable_from<T&, T&> &&
std::assignable_from<T&, const T&> &&
std::assignable_from<T&, const T>;
我想知道为什么可复制对象也应该是可 move 的。想想一个被多个函数访问的全局变量。虽然复制该变量是有意义的(例如在调用另一个函数之前保存它的状态),但 move 它是没有意义的,而且实际上会非常糟糕,因为其他函数可能不知道该变量当前处于未指定的状态.那么为什么 std::copyable包含 std::movable ?

最佳答案

这来自两个事实。首先,即使您没有定义 move 构造函数 + move 赋值,如果您定义了复制函数,您仍然可以从 r 值引用构造/分配对象。看看这个例子:

#include <utility>

struct foo {
foo() = default;
foo(const foo&) = default;
foo& operator=(const foo&) = default;
};

int main()
{
foo f;
foo b = std::move(f);
}
其次(也许更重要的是),可复制类型始终可以(或根据标准现在必须是)也可以以某种方式 move 。如果对象是可复制的,那么最坏的 move 场景就是复制内部数据。
请注意,由于我声明了复制构造函数,因此编译器没有生成默认的 move 构造函数。

关于c++ - 为什么 std::copyable 包含 std::movable ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62810498/

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