gpt4 book ai didi

c++ - 对 std::move(x) 执行一些操作

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

让我们 Handlebars 续拿开。

17.3.28 valid but unspecified state [defns.valid]

an object state that is not specified except that the object's invariants are met and operations on the object behave as specified for its type

[ Example: If an object x of type std::vector<int> is in a valid but unspecified state, x.empty() can be called unconditionally, and x.front() can be called only if x.empty() returns false. — end example ]

一些用户建议std::move(x).something()是荒谬的。但我无法理解 std::move(x).something() 之间的区别和 y = std::move(x); y.something() .观察:

// -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC
std::vector<int> v;
v.pop_back();
// Error: attempt to access an element in an empty container.

现在我们要尝试我们的荒谬案例:

std::vector<int> v(10);
std::move(v).pop_back();

没有错误。这一定是大家口中的“valid but unspecified”,但让我们继续。

std::vector<int> v(10);
std::cout << std::move(v).size();
auto v2 = std::move(v);
std::cout << v.size();

这会打印出 100 .这并不奇怪。 std::move只是一个 Actor ,它实际上并不执行 move 构造函数的工作。

我是漏掉了什么还是 std::move(x).something()仍然没有意义(除了是空操作之外)?


供引用,请参阅 Member function .begin() and std::begin() 上的评论以及赞成的答案。

以下示例表明 v未 move 自:

template< class C >
auto begin( C&& c ) -> decltype(c.begin())
{
return c.begin();
}

int main()
{
std::vector<int> v(10);
std::vector<int>::iterator it3 = begin(std::move(v));
std::cout << v.size();
}

输出 10 .

最佳答案

std::move 不会对该对象做任何事情!它所做的只是一个对象转换成一个 ravlue,这样它就可以被右值引用绑定(bind)。

对对象的任何修改都是通过相应的 move 构造函数或 move 赋值运算符完成的。如果没有调用,则什么也不会发生。

关于c++ - 对 std::move(x) 执行一些操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37281927/

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