我正在查看以下形式的代码:
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中的引用成员,直到构造函数退出。”这是在描述这种情况吗?
发布于 2010-11-11 03:34:10
此代码的格式不正确。不能对引用进行默认初始化或取值初始化。
如果您实际上在ref()中有一个表达式,那么是的,12.2.5将适用,并且当构造函数退出时,临时表达式将被销毁。
发布于 2010-11-11 05:06:48
您的示例不是创建临时的-为此,您需要更改为:
bar() : ref(foo()) {} 现在,您正在将引用绑定到一个临时对象,该临时对象将在构造函数结束时被销毁。你的引用将是无效的,这不是一件好事。
发布于 2010-11-11 04:40:43
我猜你想做的是:
bar() : ref(foo()) {}但是,不要天真地认为临时值的生命周期是延长的,直到有引用它。不,它实际上不是。所以,不管是否常量,你都应该用一个普通的对象来初始化引用。
https://stackoverflow.com/questions/4148202
复制相似问题