我刚刚编写了以下程序,它可以编译并运行良好。(在这里查看现场演示。)
#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 给出的答案是:
您不能为标量类型调用析构函数,因为它们没有析构函数。该语句仅适用于模板代码,您在其中调用您不知道其类型的对象的析构函数 - 它消除了为标量(甚至数组)类型编写专门化的必要性。
所以,我不明白他给出的解释。如果有人使用模板代码解释它会更好,其中析构函数被称为类型未知的对象。如果有人用简单的例子解释这一点,我将不胜感激。