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

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 中,保证不会发生移动;该对象将简单地进行值初始化。

【讨论】:

仅供参考:请为此启用编译器警告! (并将其提升为错误),您真的不需要它成为函数声明

以上是关于当我将构造函数作为参数显式调用时,不会调用移动构造函数的主要内容,如果未能解决你的问题,请参考以下文章

显式移动构造函数?

c++,类的对象作为形参时一定会调用复制构造函数吗?

单击第二次链接PrimeFaces时,构造函数不会调用

python 调用父类方法, 重写父类构造方法, 不显式调用,会报错

C++调用父类的构造函数规则

C++中派生类的构造函数怎么显式调用基类构造函数?