Pregunta

He sido codificación en C++ para el pasado pocos años.Pero hay una pregunta que no he sido capaz de averiguar.Quiero preguntar, son todos los empleos temporales en C++, rvalues?

Si no, ¿alguien puede proporcionarme un ejemplo donde temporales producidos en el código es un lvalue?

¿Fue útil?

Solución

No.

La especificación del lenguaje C ++ nunca hace una afirmación tan sencilla como la que le pregunta. No dice en ninguna parte del estándar del idioma que "todos los objetos temporales son rValues". Además, la pregunta en sí es un poco inapropiado, ya que la propiedad de ser un rValue en el lenguaje C ++ no es una propiedad de un objeto, sino más bien una propiedad de una expresión (es decir, una propiedad de su resultado). Así es como se define en la especificación del lenguaje: para diferentes tipos de expresiones, dice cuando el resultado es un LValue y cuando es un rValue. Entre otras cosas, esto en realidad significa que se puede acceder a un objeto temporal como un rValue y un LValue, dependiendo de la forma específica de expresión que se usa para realizar el acceso.

Por ejemplo, el resultado de literal 2 + 3 La expresión es obviamente un rValue, un tipo temporal int. No podemos aplicar el unary & a eso desde unary & requiere un Lvalue como su operando

&(2 + 3); // ERROR, lvalue required

Sin embargo, como todos sabemos, se puede conectar una referencia constante a un objeto temporal, como en

const int &ri = 2 + 3;

En este caso, la referencia se adjunta a lo temporal, extendiendo la vida útil de este último. Obviamente, una vez hecho, tenemos acceso a ese mismo temporal que un LValue ri, ya que las referencias siempre son Lvalues. Por ejemplo, podemos aplicar de manera fácil y legal la & a la referencia y obtener un puntero al temporal

const int *pi = &ri;

con ese puntero permaneciendo perfectamente válido siempre que el temporal persista.

Otro ejemplo obvio de acceso LValue a un objeto temporal es cuando accedemos a un objeto temporal de tipo de clase a través de su this puntero. El resultado de *this es un lvalue (como siempre es el caso con el resultado de unary * Aplicado a un puntero de datos), pero no cambia el hecho de que el objeto real podría ser fácilmente temporal. Para un tipo de clase determinado T, expresión T() es un rValue, como se indica explícitamente en el estándar del lenguaje, sin embargo, el objeto temporal accedido a través de *T().get_this() expresión (con la implementación obvia de T::get_this()) es un lvalue. A diferencia del ejemplo anterior, este método le permite obtener inmediatamente un LVALUE no calificado, que se refiere a un objeto temporal.

Entonces, una vez más, el mismo objeto temporal podría ser fácilmente "visto" como un rValue o como un LValue dependiendo de qué tipo de expresión (qué tipo de ruta de acceso) Usted usa para "mirar" ese objeto.

Otros consejos

Prasoon Saurav ya vinculó un muy buen hilo CLC ++. Allí, James Kanze explica por qué la pregunta realmente no tiene sentido. Se reduce a:

  • El rValue -ness es una propiedad (booleana) de expresiones: cada expresión es un LValue o un rValue
  • Los temporales son no expresiones

Por esa razón, la pregunta no tiene sentido.

Un buen ejemplo es el siguiente código:

int main() {
  const int& ri = 4;
  std::cout << ri << std::endl; 
}

El int temporal con valor 4 no es una expresión. La expresion ri Eso está impreso no es temporal. Es un LValue y se refiere a un temporal.

bien, que el operador de matriz devuelve una referencia, cualquier función que devuelve una referencia podría ser considerado para hacer la misma cosa?todas las referencias son const, a pesar de que pueden ser lvalues, que modificar lo que se referencia, la referencia no a la misma.mismo es cierto para el *operador,

*(a temp pointer) = val;

Juro que yo solía utilizar algunos compilador que podría pasar temp valores para cualquier función que se tomó de referencia,

así que usted podría ir a:

int Afunc()
{
   return 5;
}

int anotherFunc(int & b)
{
    b = 34;
}


anotherFunc(Afunc());

no puede encontrar uno que te permite hacer eso ahora, sin embargo, la referencia ha de ser constante en el fin de permitir el paso de temp valores.

int anotherFunc(const int & b);

de todos modos, las referencias pueden ser lvalues y temporal, el truco de ser la referencia de lo mismo no se modifica, sólo en lo que hace referencia.

si se tiene en cuenta la-> operador de operador, a continuación temporal de los punteros pueden lvalues, pero la misma condición se aplica, no es la temp puntero que se cambió, pero lo que apunta.

Una operación de indexación de matriz es tanto temporal como un LValue, algo así como un [10] = 1 es un ejemplo de lo que está buscando; El Lvalue es un puntero temporal calculado.

Respuesta corta:Sí, pero no voy a citar el estándar, porque para demostrarlo sería necesario abordar todo tipo de temporalidad que exista.Por definición, un temporal tiene una vida útil de una declaración, por lo que asignar cosas a una sería, en el mejor de los casos, un mal estilo.

Interesante respuesta:La elisión de copia puede hacer (a menudo hace) que un objeto temporal sea idéntico a un objeto lvalue.Por ejemplo,

MyClass blah = MyClass( 3 ); // temporary likely to be optimized out

o

return MyClass( 3 ); // likely to directly initialize object in caller's frame

Editar: en cuanto a la cuestión de si existe algún objeto temporal en esos casos, §12.8/15 menciona

la operación de copia se puede omitir construyendo el objeto temporal directamente en el destino de la copia omitida

lo que indicaría que hay un objeto temporal que puede ser idéntico a un valor l.

SharePoint Designer proporciona una colección de acciones de flujo de trabajo que están disponibles a través de la interfaz de usuario del diseñador de flujo de trabajo (UI). Aunque el rango de acciones de flujo de trabajo que se incluye en SharePoint Designer es extenso, sin embargo, es finito. En algunos casos, es posible que deba modelar un proceso de negocio cuyos requisitos no se cumplan con la biblioteca existente de acciones de flujo de trabajo disponibles en SharePoint Designer.

Puedes echar un vistazo a los enlaces a continuación,

mejores prácticas para crear personalización Actividades en SharePoint 2010

Actividades útiles de flujo de trabajo personalizado de diseñador de SharePoint. -> En esto puedes hacer uso del "Enviar Correo electrónico con la actividad de archivos adjuntos de archivo HTTP "-> Esta actividad permite enviar correos electrónicos con archivos adjuntos recuperados utilizando una solicitud web. El informe de ejecución de servicios de informes y enviarlo como un archivo adjunto desde el flujo de trabajo SPD sería uno de ese ejemplo. Solicitud URL es totalmente personalizable y puede incluir variables de flujo de trabajo. Se admiten solicitudes tanto HTTP como HTTPS. .

SharePoint 2010: cree una actividad de flujo de trabajo usando Visual Studio 2010

Actividades de diseñador de SharePoint para SharePoint 2010.

¿Cómo creo una acción personalizada para un flujo de trabajo?

Si no, ¿alguien puede proporcionarme un ejemplo en el que se produce temporalmente en el código es un LValue?

El siguiente código vincula una referencia constante a un objeto de tipo temporal const float Creado por el compilador:

int i;
const float &cfr = i;

El comportamiento es "como si":

int i;
const float __tmp_cfr = i; // introduced by the compiler
const float &cfr = __tmp_cfr;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top