Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在std::move(x)上执行某些操作_C++_Move Semantics - Fatal编程技术网

C++ 在std::move(x)上执行某些操作

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

让我们把手续处理掉

17.3.28有效但未指定的状态[定义有效]

除对象的 满足不变量,对象上的操作按指定方式进行 就其类型而言

[示例:如果类型为
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