2012-08-31 14 views

Respuesta

12

Sí, hay una diferencia.

§5.1.2 [expr.prim.lambda] p14

Una entidad es capturado por copia si es capturado de forma implícita y la captura de -default es = o si se captura de forma explícita con una captura que no incluye un &. Para cada entidad capturada por copia, se declara un miembro de datos no estático no identificado en el tipo de cierre. El orden de declaración de estos miembros no está especificado. El tipo de dicho miembro de datos es el tipo de la entidad capturada correspondiente si la entidad no es una referencia a un objeto, o el tipo de referencia en caso contrario.

Por lo tanto, si captura un identificador que nombra una referencia por valor, obtiene una copia del objeto al que se hace referencia.

+0

¿Esto significa que este resultado es incorrecto ?: http://ideone.com/L64Ul – jrok

+2

No, está bien, ya que se permite el acceso a las variables globales. La salida debe ser 2, siempre que no te olvides de inicializar i con 0. – JohnB

+0

@John: Gracias, pasé por alto totalmente la discrepancia entre la captura y la variable utilizada. Ahora obtiene [el error esperado] (http://liveworkspace.org/code/6f2da9b2b748758e5563fd424408b334). Además, los tipos incorporados globales tienen cero inicialización. :) – Xeo

16

Creo que ha caído en un error común ... las referencias son alias a objetos reales. Después de la inicialización, cualquier uso de la referencia es exactamente equivalente a un uso del objeto original. Si considera esto, la pregunta tiene poco sentido. Si la referencia es el objeto, entonces el comportamiento de [foo](){} será exactamente igual independientemente de si foo es un objeto o una referencia al objeto.

+2

@Eloff: No creo que haya entendido lo que dije. Por supuesto, una * copia * y una * referencia * son cosas completamente diferentes. Lo que pareces no captar es que * después de la inicialización * la referencia es un ** alias ** al objeto original. Tanto si hay un puntero subyacente como si no, la semántica es como si se hubiera utilizado el objeto * original *. Todo tu comentario está fuera de lugar. –

+0

Aha, ¡eso tiene más sentido! Lamento haber leído tu respuesta mal. Eliminaré mi comentario para no confundir a las personas. – Eloff

+1

@Eloff: Ahora confunde a las personas porque no pueden ver a lo que David estaba respondiendo. ; -] – ildjarn

Cuestiones relacionadas