当我将构造函数作为参数显式调用时,不会调用移动构造函数
Posted
技术标签:
【中文标题】当我将构造函数作为参数显式调用时,不会调用移动构造函数【英文标题】:move constructor is not getting called when I am calling constructor explicitly as a parameter 【发布时间】:2019-08-27 22:10:54 【问题描述】:我正在尝试学习移动构造函数。我写了下面的程序。
#include <iostream>
#include <algorithm>
using namespace std;
class myclass
public:
myclass()
cout << "In Constructor" << endl;
~myclass()
cout << "In Destructor" << endl;
myclass(const myclass &obj)
cout << "In Copy Constructor" << endl;
myclass(myclass &&obj)
cout << "In Move Constructor" << endl;
;
int main()
myclass obj = myclass(); // Line 1
myclass obj(myclass()); // Line 2
第 1 行按预期工作,如果我使用 '-fno-elide-constructors' 标志,将调用移动构造函数。 但是对于第 2 行,什么都没有发生。甚至没有构造函数被调用。我认为第 2 行也会调用移动构造函数。但是没有函数被调用。我知道如果我显式调用构造函数,对象将在表达式结束时被销毁。但我不确定为什么连构造函数都没有被调用。谁能告诉我第2行有什么问题?
【问题讨论】:
【参考方案1】:这是most vexing parse 的示例; obj
被声明为一个函数,而不是 myclass
类型的对象。通过将一对(或两对)括号更改为大括号,可以避免大多数最令人烦恼的解析实例。例如:
myclass obj(myclass);
请注意,即使在 C++11 中,编译器 may optimize out the move(同时具有直接初始化和复制初始化)。在 C++17 中,保证不会发生移动;该对象将简单地进行值初始化。
【讨论】:
仅供参考:请为此启用编译器警告! (并将其提升为错误),您真的不需要它成为函数声明以上是关于当我将构造函数作为参数显式调用时,不会调用移动构造函数的主要内容,如果未能解决你的问题,请参考以下文章