从标准6.7.7(临时对象)中,我们可以看到:
当将类类型X的对象传递给函数或从函数返回时,如果X具有至少一个合格的复制或移动构造函数([特殊]),每个这样的构造函数都是平凡的,并且X的析构函数要么是平凡的,要么被删除,实现允许创建一个临时对象来保存函数参数或结果对象。分别从函数参数或返回值构造临时对象,并使用合格的平凡构造函数将函数的参数或返回对象初始化为复制临时对象(即使该构造函数不可访问或不会被重载决议选择来执行对象的复制或移动)。 [注4:授予这种自由度是为了允许将类类型的对象传递给函数或从函数返回寄存器。—结束语]
这是否意味着在平凡可复制类型中不强制执行复制省略?我理解的是,如果我们声明像
当将类类型X的对象传递给函数或从函数返回时,如果X具有至少一个合格的复制或移动构造函数([特殊]),每个这样的构造函数都是平凡的,并且X的析构函数要么是平凡的,要么被删除,实现允许创建一个临时对象来保存函数参数或结果对象。分别从函数参数或返回值构造临时对象,并使用合格的平凡构造函数将函数的参数或返回对象初始化为复制临时对象(即使该构造函数不可访问或不会被重载决议选择来执行对象的复制或移动)。 [注4:授予这种自由度是为了允许将类类型的对象传递给函数或从函数返回寄存器。—结束语]
这是否意味着在平凡可复制类型中不强制执行复制省略?我理解的是,如果我们声明像
~Object() {} 这样的析构函数而不是不声明任何内容(因此编译器将生成析构函数)或默认析构函数,则对象变得不可平凡构造,因此必须执行复制省略(在满足复制省略发生的众所周知条件的情况下)。