2011-07-16 25 views
4

一般来说,这是讨论最多只能局部功能变量:什么是常数引用右值的类数据成员的生命周期?

void foo (const int &i) 
{ 
    // use i till foo() ends 
} 
foo(3); 

但是,没有此规则适用于class成员也?

struct A { 
    const int &a; 
    A() : a(3) {} // version 1 
    A (const int &i) : a(i) {} // version 2 
}; 

现在作为A

{ 
    return()? new A : new A(3) : new A(some_local_variable); 
} 

意志a内容保持相同通过了所有3new LY分配A的续航时间?

+0

一般来说,寿命不够长。从12.2/5开始:“在函数调用(5.2.2)中临时绑定到引用参数,直到完成包含调用的完整表达式。”有关完整的详细信息,请参阅http://stackoverflow.com/questions/2604206/c-constant-reference-lifetime/2604269#2604269。 –

+0

但是,我应该注意,将const引用绑定到文字“3”是没问题的,因为没有生成临时文件,并且文本的生命周期超过了'A'对象的生命周期。但是,如果转换是必要的,那么这不会成立。 –

回答

3

的C++ 03标准(章节“12.2/5的临时对象”)恰当地回答您的问题:

到其中参考结合临时或暂时认为是完整的对象到一个子对象的临时绑定持续参考的生命周期,除非如下所述。 临时绑定到构造函数的ctor-initializer(12.6.2)中的引用成员,直到构造函数退出。临时绑定到函数调用中的引用参数(5.2.2)直到完成包含调用的完整表达式。

+0

那么在这种情况下,像1,2,3这样的右值也会被视为临时值? – iammilind

+0

@iammilind:是的,我相信。 –

+0

嗯,我听说这样的值存储像只读内存区域中的字符串文字。但是,您的答案在一般意义上是正确的。我接受它将“规格”放入其中。 – iammilind

2

如果你使用new分配一个对象,它将永远留在内存中 - 直到你delete它。这不是一个临时对象。

aA的成员,并作为此类分配的一部分。

编辑:感谢您的意见。我会说 - 不,这是不正确的。试想一下:

struct A { 
    const int &a; 
    A() : a(3) {} // version 1 
    A (const int &i) : a(i) {} // version 2 
}; 

void foo() { 
    A *pA; 

    { 
    int x; 
    pA = new A(x); 
    } 

    // Now pA->a is pointing to the address where `x` used to be, 
    // but the compiler may very well put something else in this place now 
    // because x is out of scope. 
} 

答案是比较明显的,如果A对象的生命周期横跨几个功能跨越。

附注:我发现“内容”一词在这里有点含糊。将参考等同于一个指针,所以你的a基本上指向一个整数。 const,如果整数不再存在(因为它在堆栈中并且已被删除),你的a - 仍然指向内存中的相同地址 - 现在正在引用其他的东西。 GotW文章似乎在谈论编译器延长引用指向的对象的生命周期。参考本身也是一个指针。

+0

我认为OP在询问[GotW#88中描述的情况](http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/ )也适用于'const'引用数据成员。 –

+0

我的意思是'a'的内容。 – iammilind

+1

对不起,我误读了。这实际上是一个很好的问题,我很想说“不”,它是无效的,因为问题更多地是关于被引用对象的有效性。但是,我可能会删除我的答案,因为这只是我的猜测。 – EboMike

相关问题