tomando la dirección de un objeto temporal

§5.3.1 Operadores unarios, Sección 3

El resultado del operador unario es un puntero a su operando. El operando debe ser un lvalue o un id calificado.

¿Qué significa exactamente “será” en este contexto? ¿Significa que es un error tomar la dirección de un temporal? Me preguntaba, porque g ++ solo me da una advertencia, mientras que comeau se niega a comstackr el siguiente progtwig:

#include  int main() { &std::string("test"); } 

g ++ advertencia : taking address of temporary

error comeau: la expression must be an lvalue or a function designator

¿Alguien tiene un comstackdor de Microsoft u otros comstackdores y puede probar este progtwig, por favor? Gracias por adelantado.

La palabra “deberá” en el lenguaje estándar significa un requisito estricto. Entonces, sí, su código está mal formado (es un error) porque intenta aplicar el operador de dirección a un valor no-l.

Sin embargo, el problema aquí no es un bash de tomar la dirección de un temporal . El problema es, una vez más, tomar la dirección de un valor no-l . El objeto temporal puede ser lvalue o non-lvalue dependiendo de la expresión que produce ese temporal o proporciona acceso a ese temporal. En su caso, tiene std::string("test") – un estilo de conversión funcional a un tipo que no es de referencia, que por definición produce un valor no-l. De ahí el error.

Si desea tomar la dirección de un objeto temporal, podría haber evitado la restricción haciendo esto, por ejemplo

 const std::string &r = std::string("test"); &r; // this expression produces address of a temporary 

con el puntero resultante siendo válido mientras exista el temporal. Hay otras maneras de obtener legalmente la dirección de un objeto temporal. Es solo que su método específico pasa a ser ilegal.

Cuando la palabra “deberá” se usa en el Estándar C ++, significa “debe so pena de muerte”: si una implementación no obedece a esto, es incorrecta.

Está permitido en MSVC con la opción obsoleto / Ze (extensiones habilitadas). Fue permitido en versiones anteriores de MSVC. Genera un diagnóstico con todas las advertencias habilitadas:

advertencia C4238: extensión no estándar utilizada: class rvalue utilizado como lvalue.

A menos que se use la opción / Za (imponga compatibilidad ANSI), entonces:

error C2102: ‘&’ requiere l-value

El estándar de C ++ es realmente un requisito en las implementaciones conformes de C ++. En los lugares, está escrito para distinguir entre códigos que las implementaciones conformes deben aceptar y codificar para las implementaciones conformes que deben proporcionar un diagnóstico.

Entonces, en este caso particular, un comstackdor conforme debe dar un diagnóstico si se toma la dirección de un valor r. Ambos comstackdores lo hacen, por lo que son conformes en este sentido.

El estándar no prohíbe la generación de un ejecutable si una determinada entrada causa un diagnóstico, es decir, las advertencias son diagnósticos válidos.

&std::string("test"); está pidiendo la dirección del valor de retorno de la llamada a la función (ignoraremos como irrelevante el hecho de que esta función sea un ctor). No tenía una dirección hasta que lo asignó a algo. Por lo tanto, es un error.

No soy un experto en estándares, pero ciertamente me parece un error. g ++ muy a menudo solo da una advertencia para cosas que realmente son errores.