当调用move构造函数时感到困惑
Confused when move constructor is called?
我一直在努力解决这个问题一段时间,我找不到一个解释。假设我有以下代码
class foo
{
public:
foo()
{std::cout << "Regular constructor n";}
foo( const foo& a) //In abscence of const keyword the copy constructor is called
{std::cout << "Copy constructor n";}
foo& operator=(const foo& a)
{std::cout << "Copy Assignment operator n";}
foo(foo&& a)
{
std::cout << "Move constructor n";
}
foo& operator=(foo&& a)
{std::cout << "Move Assignment operator n";}
int a;
};
foo myfunction()
{
foo d;
d.a =120;
return d;
}
现在如果我这样做
foo a = myfunction();
这是我所期望的。Myfunction()返回一个对象左值,但是由于Myfunction()是临时的,它将返回一个右值。我说的对吗?在这种情况下,move构造函数会被调用,这是有意义的。但是,如果我从复制构造函数中删除const
关键字,则调用复制构造函数而不是移动构造函数。谁能给我解释一下为什么会这样?
VS2012有一个讨厌的扩展,允许临时绑定到左值引用。我们不能用现代的、符合标准的编译器来复制,这些编译器实际上省略了对copy/move构造函数的调用(因为RVO)。应用fno-elide-constructors
选项显示,即使没有const
,它们也确实调用了move-构造函数。
From cppreference
move构造函数在对象从相同类型的xvalue初始化时调用,它包括:
-
初始化,T a = std::move(b);或者T a(std::move(b));,其中b的类型为T
-
函数参数传递:f(std::move(a));,其中a为类型T, f为void f(T T)
-
函数返回:返回a;在函数内部,比如T f(),其中a是T类型的,并且有一个move构造函数。
相关文章:
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 为什么我的代码中没有调用move构造函数
- 如何调用move构造函数
- 复制初始化:为什么即使关闭了复制省略,也没有调用move或copy构造函数
- 为什么编译器在调用 move 后选择复制 ctor
- 反复调用MOVE,其中需要RVALUE参考
- 如何在基类中调用 "move" '&&' 构造函数?在C++
- 为什么这个函数不调用move构造函数
- c++.系统调用move什么时候会失败
- 我是否应该对非引用构造函数参数手动调用move
- 为什么不从临时对象中调用move ctor进行构造(运算符+的结果)
- 确保调用move构造函数
- 为什么在没有std::move的情况下不调用move构造函数
- 如何调用move构造函数
- 当调用move构造函数时感到困惑
- 使用隐式可转换对象调用move重载函数时的编译错误
- 通过调用Move赋值操作符实现Move构造函数
- 为什么throw局部变量调用move构造函数
- 为什么没有调用move构造函数
- 为什么这里调用move构造函数