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

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

本文关键字:构造器 情况下 移动 调用 构造函数 默认 为什么不      更新时间:2023-10-16

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

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

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

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

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

int main() {
MySecondType e;
e= MySecondType() ;
return 0;
}

我有我等待的结果,与:

MySecondType e;
e= MySecondType() ;

但我没有它,如果我有:

MySecondType e = MySecondType() ;

我期望这行:

MySecondType e = MySecondType() ;

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

你能解释一下为什么吗?

谢谢

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

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

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

相关文章: