当我将构造函数显式调用为参数时,不会调用移动构造函数

  • 本文关键字:构造函数 调用 移动 参数 c++ c++11
  • 更新时间 :
  • 英文 :


我正在尝试了解移动构造函数。我写了下面的程序。

#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 号线有什么问题吗?

这是最令人烦恼的解析示例;obj被声明为函数,而不是类型为myclass的对象。通过将一对(或两对(括号更改为大括号,可以避免大多数最令人烦恼的解析实例。例如:

myclass obj(myclass{});

请注意,即使在 C++11 中,编译器也可以优化移动(使用直接初始化和复制初始化(。在C++17,移动保证不会发生;对象将简单地进行值初始化。

最新更新