为什么不调用移动构造函数? (默认只有构造函数,没有别的)
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 开始,它是强制性的。
你能解释一下为什么在下面的代码中,
#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 开始,它是强制性的。