C 向构造函数和临时对象的明确调用

c++ explicit call to constructor and temporary object

本文关键字:调用 临时对象 构造函数      更新时间:2023-10-16
#include <iostream>
using namespace std;
class Test
{
    public:
    Test()  { cout << "Constructor is executedn"; }
    ~Test() { cout << "Destructor is executedn";  }
};
int main()
{
     Test();  // Explicit call to constructor
    return 0;
}

在上面的代码中,我们正在明确调用构造函数,当构造函数明确称为构造函数时,编译器会创建一个无名的临时对象,并立即被破坏。为什么我们需要这个临时对象?

因为构造函数&amp;破坏者具有副作用。他们都打印了东西。

如果他们没有副作用,则编译器可能足够聪明,可以弄清楚它实际上不需要创建临时性,并完全跳过。

您正在使用的功能类型转换符号Test(...),实际上是指从C 98到C 的"创建类型Test"的临时对象14。因此,根据要求创建临时性,并调用构造函数以初始化对象。它确实是不是的意思是"调用构造函数"。实际上,构造函数的执行永远无法与对象的创建分开。

在C 17中,Test()是一种序言,因为它被用作丢弃值表达式。在物质化时,创建了临时对象,并调用构造函数。确实,构造函数的执行永远不会与对象的创建分开。

标准(C 14)简要提到了临时对象的某些情况:

1. Binding a reference to a prvalue
2. Returning a prvalue 
3. A conversion that creates a prvalue
4. Throwing an exception
5. In some initializations

您可以从Stackoverflow获取prvalue的描述。我已经从Quora那里收集了情况。

re

&rdquo; 为什么我们需要这个临时对象??

&hellip;我们没有。只要效果是 构造函数和驱动器均已称为副作用。

编译器无法删除构造函数和驱动器副作用,因为标准明确要求它不要删除其构造或破坏具有副作用的本地对象:

c 11§3.7.3/3 basic.std.auto/3

&rdquo; 如果具有自动存储持续时间的变量具有初始化或具有副作用的破坏者,则不得 在其块结束之前被摧毁,即使它似乎是优化的,也不应将其消除 未使用,除了可以按照12.8中指定的类对象或副本/移动。

中的指定。