Estoy buscando en el código de la siguiente forma:valor de inicialización de un miembro const refiero
class foo
{
public:
foo() {}
//...
};
class bar
{
public:
bar() : ref() {}
private:
const foo &ref;
};
se está iniciando una referencia temporal utilizando una de esta manera correcta? Sé que es posible inicializar una referencia constante que sea una variable local con una temporal, y que al hacerlo amplíe la vida útil del temporal, p.
const foo &tmp = funcThatReturnsByValue(); //OK
Sin embargo, una de las respuestas a la relacionada initialize reference in initialization list sugiere que hay una diferencia entre, y que al inicializar ref
que el anterior es un comportamiento indefinido "de larga duración" referencias "de corta duración" y (a pesar de que ref
es una referencia const
).
12.2.5 en el estándar dice, en parte, "Un enlace temporal a un miembro de referencia en el inicializador de códigos del constructor persiste hasta que el constructor sale". ¿Eso es describir esta situación?
¿Podría arreglar su código para que realmente implique un temporal? –
ref() no enlaza ref a una instancia temporal de foo? Lo siento si mi terminología es imprecisa ... Hago mi mejor esfuerzo para comprender este fragmento de código. – user168715
Quizás este comentario no valga la pena (no conozco el contexto en el que está viendo este código), pero el problema desaparece si 'ref' es un puntero. El punto es que las referencias no se pueden inicializar en valores, pero los punteros pueden (se inicializan en cero). Además, la mayoría de los compiladores (al menos MSVC) emiten una advertencia por no poder generar un operador de asignación predeterminado. Como guía, cuando quiera un miembro de referencia, realmente quiere un puntero ... –