C 11移动无效
c++11 move not take effective?
i测试了C 11移动功能,但没有有效。谁能告诉我为什么?谢谢。代码如下:
class Base {
public:
Base() { cout << "Base" << endl;}
~Base() { cout << "~Base" << endl;}
Base(const Base& base) { cout << "Copy" << endl; }
Base& operator=(const Base& base) {cout << "operator=" << endl;}
Base(Base&& base) { cout << "move" << endl;}
Base& operator=(Base&& base) { cout << "move=" << endl;}
};
Base b;
Base&& GetResult() {
return std::move(b);
}
int main() {
Base&& tmp = GetResult();
cout << &b << endl;
cout << &tmp << endl;
}
输出:
Base
0x6013a0
0x6013a0
~Base
为什么不调用move copy
和move operator=
?为什么地址是相同的?
要添加出色的现有答案,我相信这里的主要要点是std::move
所做的。
std::move
不移动。
它是 abymally 命名的。
它只会给您一个XVALUE,指的是您提供的任何东西;该XVALUE将绑定到LVALUE不会的RVALUE参考。这意味着将std::move
的结果提供给移动构造函数或移动分配运算符。但是,它不为您做,而您在这里不这样做。
给予对命名的强烈批评,您肯定有另一种建议
&ndash;用户2079303
这是一个很好的话题,但是C 的创建者建议std::rval
,现代C 的建筑师之一建议std::rvalue_cast
(即使您实际上得到了Xvalue(。
就个人而言,我认为std::moveable
将是一个不错的中间立场。
为什么移动复制和移动操作员=不称为?
我假设通过"移动复制"您的意思是"移动构造函数"。移动分配运算符未调用,因为您永远不会使用分配运算符。
没有移动(也没有副本(,因为 Base&&
是参考(对特定的R值引用(。引用参考/指向对象 - 它们不包含对象的状态。初始化参考时,没有复制或移动对象。
为什么地址是相同的?
将操作员地址应用于参考时,您将获得引用对象的地址。
让我们忽略一分钟的移动语义,只考虑熟悉的C 98复制构造函数。给定以下代码,您期望什么输出?
class Base {
public:
Base() { cout << "Base" << endl;}
~Base() { cout << "~Base" << endl;}
Base(const Base& base) { cout << "Copy" << endl; }
Base& operator=(const Base& base) {cout << "operator=" << endl;}
};
Base b;
Base& GetResult() {
return b;
}
int main() {
Base& tmp = GetResult();
cout << &b << endl;
cout << &tmp << endl;
}
当然,您希望呼叫Base
默认构造器,然后是b
的地址两次,然后是Base
Destructor。原因是因为您仅构建一个Base
实例,而永远不会复制它 - 您只使用引用。
,您的示例就是这样。您使用的是rvalue参考而不是lvalue参考,但要点是相同的 - 只有一个Base
变量,并且没有复制或移动发生。如果您想见证动作语义的动作,则可以尝试这样的事情:
Base getBase() {
return Base{};
}
int main() {
Base tmp = getBase();
Base other = std::move(tmp);
}
(从getBase()
移出可能会由编译器优化,但您仍然应该看到第二个。(
- 将对象移动到std::shared_ptr
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 何时在引用或唯一指针上使用移动语义
- 无法访问嵌套类.类的使用无效
- 如何从具有移动语义的类对象中生成共享指针
- 将shared_ptr移动到<StructA>shared_ptr<变体<结构A、结构 B>>
- C / C++ 移位/偏移/向左或向右移动位图?
- MSVC将仅移动结构参数解释为指针
- 如果用户输入无效,如何使用字符串变量-C++重复输入命令
- 自定义先决条件对移动分配运算符有效吗
- 返回值优化:显式移动还是隐式
- 当有分配器意识的容器被复制/移动时,反弹分配器是否被复制/移走
- 移动构造函数是否使shared_from_this无效
- C 11移动无效
- 我可以在 std::list 中移动元素而不会使迭代器或引用无效,但是如何移动呢?
- 移动语义:从"类型&&"到"类型"的转换无效。模板:将未知参数传递给重载函数
- 使用 CSplitterWindowImpl 处理移动并使子窗格无效
- std::list-是在移动时无效的迭代器
- 条件跳转或移动取决于未初始化的值和大小的无效写入
- 捕获和调试对移动lambda内部局部变量引用的无效使用