Para foo
declarado como Foo& foo = ...;
, ¿hay alguna diferencia entre la captura por valor y la semántica de captura por referencia para lambdas?¿Hay alguna diferencia entre [& foo] {...} captura y [foo] {...} captura si 'foo' es una variable de referencia?
Respuesta
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.
¿Esto significa que este resultado es incorrecto ?: http://ideone.com/L64Ul – jrok
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
@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
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.
@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. –
Aha, ¡eso tiene más sentido! Lamento haber leído tu respuesta mal. Eliminaré mi comentario para no confundir a las personas. – Eloff
@Eloff: Ahora confunde a las personas porque no pueden ver a lo que David estaba respondiendo. ; -] – ildjarn
- 1. ¿Hay alguna diferencia entre "foo is None" y "foo == None"?
- 2. Diferencia entre "struct foo *" y "foo *" donde foo es una estructura?
- 3. Diferencia entre clase foo y clase foo (objeto) en Python
- 4. ¿Hay alguna diferencia entre foo (void) y foo() en C++ o C?
- 5. Foo f = Foo(); // no hay función de coincidencia para la llamada a 'Foo :: Foo (Foo)' ... ¿eh?
- 6. Rieles: ¿hay alguna diferencia entre 'references: foo' y 'integer: foo_id'?
- 7. var foo = foo || alerta (foo);
- 8. 'var foo = función ...' y 'la función foo() ...'
- 9. Referencia estándar para int foo = foo
- 10. ¿Cuál es la diferencia entre 'foo = Nothing' y 'foo is Nothing' en VB.NET?
- 11. char * foo vs char * foo
- 12. ¿La diferencia entre declarar una variable como "var $ foo" o "$ foo" en PHP?
- 13. Diferencia entre foo.setVisibility (View.GONE) y parent.removeView (foo)
- 14. ¿Cuál es la diferencia entre `raise" foo "` y `raise Exception.new (" foo ")`?
- 15. ¿Cuál es la diferencia de rendimiento, si existe, entre if (! Foo) y if (foo == false) en Java?
- 16. Foo no se puede convertir a Foo
- 17. Diferencia entre <T extends A> void foo (T t) y void foo (A a)
- 18. jQuery $ each (arr, foo) contra $ (arr) .Cada (foo)
- 19. ¿Cómo sabe Scala la diferencia entre "def foo" y "def foo()"?
- 20. ¿Qué significa esto? int foo = foo + 4;
- 21. polimorfismo C++ ((X *) y) -> foo() vs ((X) * y) .foo()
- 22. Absoluto ("/ foo") y relativo ("../foo") nombres de archivo. ¿Cómo se llama la categoría "foo"?
- 23. Es Foo * f = new Foo buen código de C++
- 24. ¿Qué es "x && foo()"?
- 25. Asignación resultado de la función que devuelve un Foo a una constante Foo y
- 26. ¿Por qué Amazon S3 no sirve automáticamente /foo/index.html cuando solicito/foo o/foo /?
- 27. R: apt-get install r-cran-foo vs. install.packages ("foo")
- 28. ¿De qué sirve decir "#define FOO FOO" en C?
- 29. ¿Cuándo os.environ ['foo'] no coincide con os.getenv ('foo')?
- 30. Scala: 'foo def = {1}' vs 'foo def {1}'
Espero que no te importe la edición para mayor claridad. – Xeo