class ClassB {
int m_b;
public:
ClassB(int b) : m_b(b) {}
void PrintClassB() const {
cout << "m_b: " << m_b << endl;
}
};
int main(int argc, char* argv[])
{
const ClassB &af = ClassB(1);
af.PrintClassB(); // print m_b: 1 with vs2008 & gcc 4.4.3
}
鉴于上述代码,我很难理解这段代码:
Q1&GT;这条线是什么意思?
const ClassB &af = ClassB(1);
以下是我的理解:
af refers to a temporary variable ClassB(1) and after the
执行此行,临时变量被销毁并且af 指未定义的变量。在此过程中,没有 复制构造函数被调用。
那么为什么我们仍然可以发出以下声明并获得结果呢?
af.PrintClassB(); // print m_b: 1 with vs2008 & gcc 4.4.3
答案 0 :(得分:5)
const ClassB &af = ClassB(1);
const
这里延长了正在创建的临时对象(即ClassB(1)
)的生命周期。它的范围会持续到af
超出范围;
af.PrintClassB(); // print m_b: 1 with vs2008 & gcc 4.4.3
这是因为af
只是临时对象的引用,它是通过1
传递给它的构造函数。
答案 1 :(得分:5)
您所看到的内容由标准保证。
C ++ 03 12.2临时对象:
第二个上下文是引用绑定到临时的。引用绑定的临时对象或作为临时绑定的子对象的完整对象的临时对象在引用的生命周期内保持,除非下面指定...
[例如:
class C {
// ...
public:
C();
C(int);
friend C operator+(const C&, const C&);
˜C();
};
C obj1;
const C& cr = C(16)+C(23);
C obj2;
..a third temporary T3 to hold the result of the addition of these two expressions.
The temporary T3 is then bound to the reference cr..The temporary T3 bound to the
reference cr is destroyed at the end of cr’s lifetime, that is, at the end of the
program.
-end example]
答案 2 :(得分:2)
我认为你可以依靠Herb Sutter博客的这个例子来帮助你理解参考文献,const引用及其生命周期。(http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/)
来自他的博客:
通常,临时对象只会持续到它出现的完整表达式的结尾。但是,C ++故意指定将临时对象绑定到堆栈上对const的引用会延长临时对象到引用本身生命周期的生命周期,从而避免出现常见的悬空引用错误
答案 3 :(得分:1)
不,你误解了行为,这是一个明确定义的行为。
临时绑定到const引用的生命周期延长到const的生命周期。
因此,从ClassB(1)
返回的临时生命周期延长到af
的生命期,这是main
的大括号。