C++ 在std::move(x)上执行某些操作
让我们把手续处理掉 17.3.28有效但未指定的状态[定义有效] 除对象的 满足不变量,对象上的操作按指定方式进行 就其类型而言 [示例:如果类型为C++ 在std::move(x)上执行某些操作,c++,move-semantics,C++,Move Semantics,让我们把手续处理掉 17.3.28有效但未指定的状态[定义有效] 除对象的 满足不变量,对象上的操作按指定方式进行 就其类型而言 [示例:如果类型为std::vector的对象x 在有效但未指定的状态下,可以调用x.empty() 只有当x.empty()返回时,才能无条件地调用和x.front() 错误。-结束示例] 一些用户建议std::move(x)。something()是荒谬的。但是我很难理解std::move(x)之间的区别;y、 something()。注意: // -D_GLIB
std::vector
的对象x
在有效但未指定的状态下,可以调用x.empty()
只有当x.empty()
返回时,才能无条件地调用和x.front()
错误。-结束示例]
一些用户建议std::move(x)。something()是荒谬的。但是我很难理解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.
输出
10
std::move
对对象没有任何作用!它所做的只是将一个对象强制转换为一个ravlue,这样它就可以被右值引用绑定
对对象的任何修改都由相应的移动构造函数或移动辅助操作符完成。如果没有调用,则什么也不会发生
但是我很难理解std::move(x)之间的区别;y、 something()
使用(注意常量之后的&
/&
)
std::move(v)
对v
没有任何作用<代码>标准::移动(v).pop_back()代码>与v.pop_back()具有相同的效果代码>(尽管这不能推广到所有类型。)。您发布的引用缺少某些上下文。@juanchopanza我的上下文来自。如果基础范围不再存在,那么像“begin
这样的注释就没有多大用处了,因此使用右值重载似乎没有多大用处。”以及“理论上,标准容器对于在右值上下文中使用std::begin
调用没有正确的响应。”“与std::move
或rvalues交互的方式是,在调用完成后,您不应该关心moved from对象的状态。”这似乎暗示了我遗漏了什么。我的意思是,引号很可能不是指std::move(x)之类的表达式
。它可能指在y=std::move(x)之后使用x
;
“一些用户建议std::move(x)。something()
是无意义的。“需要引用吗?这不是无意义的。@Barry,的确如此。如果something方法有&
和&
重载,那么std::move(x).something()
将调用与x不同的重载。something()
void something()&{..}
和void something()&&{..}
@Barry agree将修复。
std::vector<int> v(10);
std::move(v).pop_back();
std::vector<int> v(10);
std::cout << std::move(v).size();
auto v2 = std::move(v);
std::cout << v.size();
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();
}
struct S
{
void foo() const & {std::cout << "l-value this\n"; }
void foo() const && {std::cout << "r-value this\n"; }
};
S tmp;
std::move(tmp).foo(); // "r-value this
S x = std::move(tmp);
x.foo(); // "l-value this