¿He perdido la cabeza? ¿Esto siempre estuvo permitido?
#include <iostream>
int main()
{
auto& os = std::cout;
auto write = []()
{
os << "what\n";
};
write();
}
Estoy usando:
Apple LLVM versión 10.0.0 (clang-1000.10.44.4)
Objetivo: x86_64-apple-darwin17.7.0
Aunque también ver en Coliru:
(demo en vivo)
Siempre pensé que una captura vacía no capturaría nada.
De hecho, MSDN dice:
Una cláusula de captura vacía, [ ]indica que el cuerpo de la expresión lambda no accede a variables en el ámbito adjunto.
Investigaciones posteriores sugieren que, de hecho, esto está bien para capturar const
cosas (que yo tampoco sabía, pero como sea), pero os
no es const
(¡No hay referencia! Aunque es inmutable…).
Me encontré con esto al encender -Wextra
y notando que Clang pensó un &os
la captura (que está presente en mi código real) era innecesaria. Al quitarlo, me quedé asombrado al encontrar que la construcción funcionó.
posible duplicado: stackoverflow.com/questions/43827651/…
– papagaga
21 de noviembre de 2018 a las 15:26
Extrañamente funciona con gcc 8.2…
– Matthieu Brucher
21 de noviembre de 2018 a las 15:27
Interesante. Esto parece un error de optimización, donde el compilador “ve a través” de la referencia antes de asegurarse de que la referencia en sí está bien para usar.
– Quintín
21/11/2018 a las 15:30
Hay una informe de defectos abierto cubriendo ese caso y parece no restringido para
std::cout
– enero
21 de noviembre de 2018 a las 15:56
@Jans y eso es digno de una respuesta.
– SergeyA
21 de noviembre de 2018 a las 16:07