0

你能解释一下为什么,在下面的代码中,

#include <iostream>
#include <variant>
#include <string>



class MySecondType {
public:
    MySecondType() { std::cout << "Constructeur par défaut de MySecondType\n"; }
    MySecondType(const MySecondType&) // Constructeur par copie
    {std::cout<< "Constructeur par copie de MySecondType\n";}
    MySecondType(MySecondType&&) noexcept//Constructeur par déplacement 
    {
        std::cout << "COnstructeur par déplacement de MySecondType\n";
    }


    MySecondType& operator=(MySecondType&&) noexcept
    {
        std::cout << "Opérateur d'affection par déplacement\n";
        return *this;
    }

    MySecondType& operator=(MySecondType&) 
    {
        std::cout << "Opérateur d'affection par copie\n";
        return *this;
    }



    ~MySecondType() {
        std::cout << "Destructeur de MySecondType\n";
    }

};


int main() {

    MySecondType e;
    e= MySecondType() ;
return 0;
}

我有我等待的结果:

MySecondType e;
e= MySecondType() ;

但我没有,如果我有:

MySecondType e = MySecondType() ;

我期望这条线:

MySecondType e = MySecondType() ;

会调用移动构造函数(在默认构造函数之后),但它不会调用它。它只使用默认构造函数创建一个对象,仅此而已。

你能解释一下为什么吗?

谢谢

4

1 回答 1

2

我假设你实际上做了@Jacob 暗示的事情,即MySecondType e = MySecondType();.

如果是这样,那么编译器正在省略复制/移动构造函数。它看到您正在创建一个临时对象,并且在将其分配给一个变量之后。因此,它并没有这样做效率低下,而是跳过复制/移动步骤并直接在其最终目的地构造对象。

AFAIK,这是 C++17 之前的可选优化。从 C++17 开始,它是强制性的。

于 2020-02-16T09:53:53.900 回答