以下代码是在Visual Studio 2012 Express for Windows Desktop中编译和运行的,作为学习练习.
#include <cstdio>
class X
{
public:
    X()  { printf("default constructed\n"); }
    ~X() { printf("destructed\n");}
    X(const X&) { printf("copy constructed\n"); }
    X(X&&) { printf("move constructed\n"); }
    X & operator= (const X &) { printf("copy assignment operator\n"); }
};
X A() {
    X x;
    return x;
}
int main() {
    {
        A();
    }
    std::getchar();
}
在禁用编译器优化(/ Od)的情况下编译时,结果输出表明析构函数被调用两次.考虑到只构造了一个对象,这是一个问题.为什么析构函数被调用两次?如果班级管理自己的资源,这不是一个问题吗?
default constructed
move constructed
destructed
destructed   <<< Unexpected call 
我尝试了几个实验来尝试解释输出,但最终这些并没有导致任何有用的解释.
实验1:在使用优化(/ O1或/ O2)编译相同代码时,结果输出为:
default constructed
destructed …如题。
下面是我的代码,这是最小可重现示例
啊
class B {
public:
    string n;
    B(string name) {
        this->n = name;
        cout << this->n<< " create" << endl;
    }
    ~B() {
        cout << this->n << " destory" << endl;
    }
};
class A {
public:
    vector<B> m_B;
    A():m_B(vector<B>{}) {
        cout << "class A create" << endl;
    };
    ~A() {
        cout << "class A destory" << endl;
    };
};
主程序
#include "a.h"
void addItem(A& _a,string n) {
    _a.m_B.emplace_back(n);
};
int main()
{
    A a;
    addItem(a, "a"); …