我正在查看以下表格的代码:
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
引用)。
答案 0 :(得分:4)
此代码格式错误。您无法默认初始化或初始化参考值。
如果你实际上在ref()
内有一个表达式,那么是的,12.2.5将适用,当构造函数退出时,临时将被销毁。
答案 1 :(得分:2)
您的示例不是创建临时 - 要做到这一点,您需要更改为:
bar() : ref(foo()) {}
现在您将引用绑定到临时对象,该临时对象将在构造函数的末尾被销毁。您的参考将无效,这不是一件好事。
答案 2 :(得分:1)
我想你想做的是:
bar() : ref(foo()) {}
但不要天真地认为临时的生命周期延长,直到引用它为止。不,实际上不是。因此,无论是否为const,您都可以使用普通对象初始化引用。