2

我刚刚编写了以下程序,它可以编译并运行良好。(在这里查看现场演示

#include <iostream>
typedef int T;
int main()
{
    int a=3;
    std::cout<<a<<'\n';
    a.~T();
    std::cout<<a;
    return 0;
}

为什么程序编译得很好?如果我没记错的话,标量类型在 C++ 中没有构造函数和析构函数。那么,这个程序定义好了吗?在这种情况下显式调用析构函数会破坏variable a还是在函数执行完成时编译器会自动破坏?我知道在对象的生命周期结束后访问对象在 C++ 中具有未定义的行为。但是 C++ 标准对此有何评论?

我在这里发现了一些类似的问题。@Columbo 给出的答案是:

您不能为标量类型调用析构函数,因为它们没有析构函数。该语句仅适用于模板代码,您在其中调用您不知道其类型的对象的析构函数 - 它消除了为标量(甚至数组)类型编写专门化的必要性。

所以,我不明白他给出的解释。如果有人使用模板代码解释它会更好,其中析构函数被称为类型未知的对象。如果有人用简单的例子解释这一点,我将不胜感激。

4

1 回答 1

0

据此:_

普通析构函数是不执行任何操作的析构函数。具有普通析构函数的对象不需要删除表达式,并且可以通过简单地释放它们的存储来处理。所有与 C 语言兼容的数据类型(POD 类型)都可以轻松破坏。

可能这类似于在 C++ 中您可以像任何类类型对象一样初始化任何 POD 类型对象,(init_val)例如通过调用其构造函数int i(-1);

但是请注意,根据定义,直接为普通对象(例如局部变量)调用析构函数会在作用域结束时再次调用析构函数时调用未定义的行为。

于 2015-08-26T04:02:57.610 回答