为什么不调用移动构造函数?(默认情况下只有构造器,没有别的)
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 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 开始,这是强制性的。
相关文章:
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 为什么不调用移动构造函数?(默认情况下只有构造器,没有别的)
- 在不使用统一的情况下将纹理传递给 GLSL 着色器?
- 如何在没有复制构造函数的情况下为地图设置值?
- 我可以在没有堆栈的情况下在二叉搜索树中实现迭代器吗?
- 如何在多写入器情况下对文件支持的共享内存中的大页面出错
- 在没有默认构造函数的情况下创建的派生对象
- 在双重继承的情况下如何处理非标准构造函数
- 如何在没有侦听器的情况下创建 TCP 连接?
- 在无法访问向量的情况下查找迭代器的末尾
- 如何在不知道属性具有哪些构造函数的情况下初始化属性?
- 在 C++ 中,默认情况下构造函数为类的数据成员提供的值是多少?
- 如何在编译器C++不智能的情况下实现 GLSL vec* 构造语法?
- 如何防止类中的类对象尝试在没有默认构造函数的情况下自动构造自身?
- 在没有堆的情况下用两种方法构造对象
- 为什么C++默认情况下不移动构造右值引用?
- 父类有 26 个构造函数重载.如何在不复制+粘贴 26 个重载的情况下将一个小任务附加到所有构造器?
- 您可以在不调用构造函数的情况下调用攻击器吗?
- C++类是否有默认构造器以及在以下情况下调用哪些构造函数?