这个 C++ 编译器优化的名称是什么(在自身的实例上调用对象自己的构造函数),它是如何工作的?

What is the name of this C++ compiler optimization (calling an objects own constructor on an instance of itself), and how does it work?

我正在尝试学习 C++ 中的资源管理,在我的研究中我遇到了一个有趣的优化。 基本上,当使用复制构造函数初始化堆栈上的对象时,该对象是右值对象(它是右值吗?),而不是调用构造函数然后调用移动构造函数,编译器只调用原始对象的构造函数。

Object c(Object(1)); // This is the same as Object c(1);
Object c(Object(Object(Object(Object(Object(1)))))); // This is also the same as Object c(1);
Expected flow:
1. Object(1) calls the constructor and creates a nameless Object that will be removed as soon as it's created.
2. c notices this is an rvalue, and calls the move constructor.
3. Destructor for Object(1) is called.
Actual flow:
1. c(1) is called.

这很聪明,但是..如何?这个技巧背后的机制是什么?即使 Object 的构造函数接受指针和许多参数,这仍然有效。

在 C++17 之前,此行为属于 copy elisionObject(x) 指定创建临时对象,但编译器可以自行决定在某些情况下忽略创建和销毁所有临时对象。

自 C++17 以来,现在 Object(x) 意味着迟早可能会有一个 Object 使用初始化程序 x 创建。该对象称为 结果对象 并且结果对象的身份由该表达式出现的上下文确定,在您的代码中 c 是所有的结果对象该形式的表达式,并且这两行与 Object c(1); 完全相同。这适用于类别 prvalue .

的所有表达式

后者为编码人员提供了更多确定性,不会制作不必要的副本。