为什么不调用移动构造函数? (默认只有构造函数,没有别的)

Why the move-constructor is not called ? (only the constuctor by default, and nothing else)

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

#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() ;

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

你能解释一下为什么吗?

谢谢

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

如果是,则编译器省略了 copy/move 构造函数。它看到您正在创建一个临时对象,并在将其分配给变量后立即创建。因此,它没有这样做,效率很低,而是跳过 copy/move 步骤并直接在其最终目的地构造对象。

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