该标准并未强制要求任何内存区域(堆/堆栈),但它们就像局部变量"自动存储",即表达式的末尾(或绑定到ref-to-const时更长)被毁坏了.
大多数实现都会像局部变量一样将它们存储在堆栈中.
编辑:
正如James Kanze指出的那样:在临时的生命周期通过ref-to-const扩展的情况下,其存储位置在大多数实现上由该引用的存储位置决定.也就是说,在引用处于静态存储的情况下,临时也是(仅在gcc上确认).(虽然恕我直言,虽然这在标准意义上仍然是暂时的,但这是否是直觉英语意义上的这个词是暂时的)
这取决于他们的一生.您在函数内部创建的Temporaries很可能是在堆栈上创建的,您不会将其绑定到本地静态引用以延长其生命周期.绑定到本地静态引用的临时存储器很可能存储在程序二进制文件的.data部分中.对于绑定到非本地引用的临时对象也是如此.在初始化非局部变量期间创建的临时变量,除了由引用绑定的变量之外,应该在产生该非局部变量值的函数的堆栈上.
在展开期间表示抛出对象的异常对象也是临时对象.那些通常驻留在堆上.
这高度依赖于实现,但它们可能驻留在自动存储中。
请注意,由于优化,范围可能是违反直觉的。
下列:
class A
{
//...
};
//....
A foo()
{
A a;
return a;
}
Run Code Online (Sandbox Code Playgroud)
在这里,对象a
不一定只驻留在函数的作用域内,但 RVO 可能会发生。
此外,当按值传递临时对象时,它可能不会立即被破坏。
void foo(A a);
//...
foo( A() );
Run Code Online (Sandbox Code Playgroud)
在这里,临时变量不一定只存在于该行中,而是可以直接在方法的参数堆栈内构造。