c++ - 为什么不调用移动构造函数
问题描述
所以我是移动语义的新手,我正在测试以下代码。我的理解是右值将调用移动构造函数,我预计 A("123") 将导致调用移动构造函数。但是当我运行它时,会调用复制构造函数。
#include <string>
#include <iostream>
#include <utility>
class A
{
std::string s;
public:
A(const std::string& in) : s(in) { std::cout << "ctor!\n";}
A(const A& o) : s(o.s) { std::cout << "move failed!\n"; }
A(A&& o) noexcept : s(std::move(o.s)) { }
};
class B
{
A d_a;
public:
B(const A& a) :d_a(a)
{}
};
int main()
{
std::cout << "Trying to move A\n";
B b(A("123")); // move-constructs from rvalue temporary
}
解决方案
问题是构造函数B
:
B(const A& a) :d_a(a) {}
函数参数const A&
是一个 const 限定的左值引用,您不能将其强制转换为右值。您需要将构造函数更改为(或添加第二个)
B(A&& a) : d_a(std::move(a)) {}
作为旁注,您可以免费获得示例中类型的正确移动语义,如果您将它们定义为
struct A {
std::string s;
};
struct B {
A d_a;
};
与客户端代码
B b{A{"123"}};
我知道您不想依赖编译器生成的特殊成员函数来研究移动构造,我只是不想省略这个快捷方式,因为这是一个应该努力的设置:让复制和你的类的移动语义由它们的数据成员自动组装。
推荐阅读
- java - 如何使用 Selenium 和 Java 通过标签定位并单击单选按钮
- excel - 如何将命令栏放置在我想要的位置
- python-3.x - Pandas 合并,冲突列中的条件更新
- python - 为什么 Keras model.fit() 将整个数据集作为一个批次使用并且内存不足?
- reactjs - Reactjs “SyntaxError: Unexpected token <” while npm start
- php - 如何在 PHP 中制作两个相似的下拉菜单?
- sql - SQL Server - 查找下过两种类型订单的所有客户
- javascript - 为什么在嵌入 c++ 的 v8 中运行一个非常简单的脚本会占用内存?
- python - 如何从一个链接生成一个已解析的项目与来自同一项目列表中的其他链接的其他已解析项目
- build - 有没有办法在 C# 代码中获取活动解决方案配置名称?