2010-11-10 40 views
6

我在看下面的表格代码:值初始化一个const成员的引用

class foo 
{ 
    public: 
    foo() {} 

    //... 
}; 

class bar 
{ 
    public: 
    bar() : ref() {} 

    private: 
    const foo &ref; 
}; 

正在初始化以这种方式使用的临时正确的参考?我知道可以使用临时变量初始化一个局部变量的const引用,并且这样做延长了临时变量的生存期,

const foo &tmp = funcThatReturnsByValue(); //OK 

然而,答案相关的initialize reference in initialization list之一表明,有“短命”和“长寿命”的引用,而如上初始化ref是不确定的行为(即使ref之间的差异是const参考)。

标准中的12.2.5部分说“在构造函数的ctor-initializer中引用成员的临时绑定一直存在,直到构造函数退出”。这是描述这种情况吗?

+0

你能修复你的代码,以便它实际上涉及临时? – 2010-11-10 19:34:09

+0

ref()不会将ref绑定到foo的临时实例?对不起,如果我的术语不准确......我正在尽我所能去理解这段代码片段。 – user168715 2010-11-10 19:42:21

+0

也许这个评论是毫无价值的(我不知道你在看这段代码的上下文),但是如果'ref'是一个指针,问题就会消失。关键是引用不能被初始化,但指针可以(它们被初始化为零)。而且,大多数编译器(至少MSVC)都会发出警告,无法生成默认赋值运算符。作为一个指导原则,无论何时你想要一个引用成员,你实际上需要一个指针...... – 2010-11-10 21:03:01

回答

4

此代码格式不正确。您不能默认初始化或初始化引用。

如果你实际上有一个表达式ref(),那么是的,12.2.5将被应用,并且当构造函数退出时临时的将被销毁。

+1

你会想,但我不能让GCC 4.3.4来实际做到这一点。 – 2010-11-10 19:47:51

1

我猜你想要做的是:

bar() : ref(foo()) {} 

但不要天真地认为,一个临时的寿命延长,直到有一个对它的引用。不,实际上不是。因此,无论是否为const,您都可以使用普通对象初始化引用。

2

你的例子不是创建一个临时 - 要做到这一点,你需要改变:

bar() : ref(foo()) {} 

现在你结合的参照暂时的,临时对象将在年底被销毁的构造函数。你的参考将是无效的,这不是一件好事。