如何理解"Temporary objs are destroyed as the last step in evaluating the full-expression"?谁能用一些简单的例子来说明这



根据文档((,其中说:

当实现引入类的临时对象时 有一个非平凡的构造函数([class.default.ctor], [class.copy.ctor](,它应确保调用构造函数 临时对象。同样,析构函数应被调用 临时使用非平凡析构函数 ([class.dtor](。临时 对象被销毁作为评估 (在词法上(包含 点创建它们的位置。即使该评估也是如此 以引发异常结束。值计算和副作用 销毁临时对象仅与 完整表达式,不带任何特定的子表达式。

如何理解"临时对象被销毁是评估(词法上(包含创建它们的点的完整表达式([intro.execution](的最后一步。谁能用一些简单的例子来说明这一点?

简单的例子。此表达式生成一个临时对象:

std::string("test")

在这里,该表达式用作子表达式:

function(std::string("test"));
// point A

在点 A 处,临时对象已被销毁,因为该点位于创建临时对象的完整表达式之后。


下面是一个示例,说明在不理解此规则的情况下如何编写错误:

const std::string& function(const std::string& arg) {
return arg;
}
const std::string& ref = function("test");
std::cout << ref;

在这里,作为参数创建的临时对象在完整表达式之后被销毁,因此ref变得无效 - 一个悬空的引用。将无效引用插入输出流时,行为是未定义的。

在许多情况下有效的解释是,当执行到达语句末尾的分号时,临时对象将被销毁。本解释未涵盖某些语言结构(例如for循环(,因此不要太用力。有关异常的更好说明,请参阅不是完整表达式的语句。

举个例子:

i = foo1(foo2(std::string("test")));

临时字符串在赋值之前一直保持活动状态,因为赋值发生在语句结束之前。(在本例中,完整表达式是语句。

相关内容

最新更新