可能是重复问题:
const引用是否会延长临时变量的生命周期?
假设我有一个函数f
:
int f(int x){return x;}
const int &a=f(1);
我知道
f(1)
只是一个临时对象,在此语句执行后它将被销毁,但是:
- 如果将引用声明为const,会延长
f(1)
的生命周期吗? - 如果是,那么
f(1)
将存储在哪里? - 这是否意味着当
x
超出范围时它也没有被销毁? f(1)
和x
之间有什么区别?
可能是重复问题:
const引用是否会延长临时变量的生命周期?
假设我有一个函数f
:
int f(int x){return x;}
const int &a=f(1);
f(1)
只是一个临时对象,在此语句执行后它将被销毁,但是:
f(1)
的生命周期吗?f(1)
将存储在哪里?x
超出范围时它也没有被销毁?f(1)
和x
之间有什么区别?f(1)
返回的临时值的生命周期将被延长。这个规则对于const
引用是独特的。x
或执行了复制省略。由于类型是int
,所以无关紧要。int f(int)
内部的局部变量的名称。它是一个左值。另一个是调用int f(int)
并评估为右值的表达式。将临时变量绑定到const&
会将临时变量的生命周期延长到引用的生命周期。
const_cast
才能更改它,即使这样,结果可能是未定义的行为。(我认为意图是让它们成为未定义的行为,但我远非确定要求这样的措辞是否实际出现在标准中。) - James Kanzeconst_cast
引起未定义行为的情况是对象已被声明为 const
。就我所知,对于临时对象来说,这种情况从未发生过。 - pmrvoid f(int const&)
,并使用 f(3)
调用它,则会出现问题。编译器是否需要每次创建一个新的临时对象?还是可以假设临时对象 3
没有更改?) - James Kanze