2012-03-12 14 views
5

Actualmente estoy escribiendo mi disertación de grado e implica también algunas explicaciones de la teoría detrás de C++ 11, que está muy bien ya que C++ es mi lenguaje de programación de elección y el estándar está más o menos disponible de forma gratuita (N3337) para obtener usted perdió en.¿Los objetos temporales son x valores?

Sin embargo, me he golpeado una pared al tratar de explicar la nueva categoría xvalue con precisión y en detalle. Tengo entendido que un objeto temporal siempre es un valor x pero no puedo encontrar ninguna referencia a esto en el estándar. Tengo entendido que la categoría de valor de una expresión de una llamada de función a una función que tiene un tipo de retorno no de referencia, es un valor x. El estándar dice que "un xvalor es el resultado de cierto tipo de expresiones que involucran referencias rvalue" que me está molestando. Por ejemplo:

TestClass { ... }; 
testClass createObject() { return testClass(); } 

void someFunction(TestClass& testClass) { ... } 
void someFunction(TestClass&& testClass) { ... } 

someFunction(createObject()); 

La voluntad por encima, como se esperaba, llame a la función sobrecargada que toma un valor p-referencia como parámetro. Sin embargo, createObject() no devuelve una referencia rvalue, sino que devuelve un objeto temporal de tipo TestClass. Mi problema es ahora, tengo que explicar las razones detrás de esto. ¿A qué se refiere la expresión "createObject()"? Si se trata de un valor x porque devuelve un objeto temporal, el razonamiento que lo respalda es claro y la referencia rvalue se favorece durante la resolución de sobrecarga. Si no lo hace, ¿cuál es la explicación de este comportamiento con respecto al estándar? ¿Hay alguna lógica de conversión implícita definida en algún lugar que no he encontrado todavía?

Realmente apreciaría si alguien pudiera ayudarme con esto porque incluso después de días de excavar y leer, aún tengo que darme una buena explicación. Muchas gracias por adelantado.

+0

[pregunta relacionada] (http://stackoverflow.com/questions/6609968/) – fredoverflow

Respuesta

10

Los objetos nunca son valores {l | r | x}. las categorías de valor describen expresiones.

xValue es la categoría de valor de la expresión llamada de función, donde el tipo de retorno de la función es una referencia rvalue a objeto (por ejemplo std::move), y también es la categoría de valor de la expresión de conversión en el que el reparto es a un rvalue referencia al objeto (por ejemplo, las agallas de std::move).

La expresión llamada a la función createObject() en su ejemplo es una expresiónprvalue porque es una llamada de función a una función con no referencia el tipo de devolución.

+0

Sé que las categorías solo se aplican a las expresiones. :) Lo siento, no estaba claro en mi publicación y la corregiré momentáneamente. ¿Me siento estúpido ahora? Realmente estúpido. No sé lo que estaba pensando esperando que la expresión de una llamada a función con un tipo de devolución sin referencia sea un valor x. Muchas gracias. Y mejor me voy y me escondo ahora ... :( – khaos

Cuestiones relacionadas