compiler c++ visual-c++ lambda clang copy-constructor

compiler - VC++ 15 llama al constructor de copia incorrecto para la captura lambda?



c++11 compiler (1)

Considere el siguiente programa:

#include <iostream> struct X { X () = default; X (X &) { std::cout << "non-const called" << std::endl; } X (X const &) { std::cout << "const called" << std::endl; } int i () const { return 7; } }; auto f () { X x; auto lambda = [=]() { return x.i(); }; return lambda; } int main() { auto lambda = f(); std::cout << lambda () << std::endl; return 0; }

Con VC ++ 15, obtengo la salida

const called const called 7

Con Clang 3.9, me sale

non-const called 7

¿Qué compilador es correcto aquí?


Yo diría que el clang es correcto.
El constructor más adecuado se llama una sola vez cuando la lambda captura x el constructor para el valor devuelto se optimiza.
Es por eso que obtienes solo una llamada no const .

Vea aquí y aquí para más detalles sobre copia-elisión y RVO.