sun*_*369 1 c++ temporary-objects
根据文档(),其中说:
当实现引入具有重要构造函数([class.default.ctor]、[class.copy.ctor])的类的临时对象时,它应确保为临时对象调用构造函数。类似地,应使用非平凡的析构函数([class.dtor])来调用临时析构函数。临时对象在评估完整表达式 ([intro.execution]) 的最后一步被销毁,该完整表达式(在词法上)包含创建它们的点。即使该评估最终引发异常也是如此。销毁临时对象的值计算和副作用仅与完整表达式相关联,而不与任何特定的子表达式相关联。
如何理解“临时对象被销毁作为评估完整表达式([intro.execution])的最后一步,该完整表达式(从词法上)包含它们被创建的点。”?任何人都可以通过一些简单的例子说清楚吗?
简单的例子。该表达式生成一个临时对象:
std::string("test")
Run Code Online (Sandbox Code Playgroud)
在这里,该表达式用作子表达式:
function(std::string("test"));
// point A
Run Code Online (Sandbox Code Playgroud)
在 A 点,临时对象已被销毁,因为该点位于创建临时对象的完整表达式之后。
以下是如果不理解此规则如何编写错误的示例:
const std::string& function(const std::string& arg) {
return arg;
}
const std::string& ref = function("test");
std::cout << ref;
Run Code Online (Sandbox Code Playgroud)
在这里,作为参数创建的临时对象在完整表达式之后被销毁,因此ref变得无效 - 悬空引用。当无效引用插入到输出流中时,行为未定义。