Tengo el siguiente fragmento de código:
boost::circular_buffer<std::tuple<float, float, float>> foo; foo.push_front(std::make_tuple(3.1f, 1.5f, 1.2f)); foo.push_front(std::make_tuple(3.6f, 1.1f, 1.7f)); foo.push_front(std::make_tuple(3.2f, 1.1f, 1.9f)); const float bar = 3.5f; // find the first tuple for which the first element is greater than bar auto firstGreater = std::find_if(foo.begin(), foo.end(), [bar](const auto &t) { return std::get<0>(t) > bar; });Al compilar este código con GCC versión 7.5.0 o 9.3.0 (no probé con otras versiones) con un indicador -Wnull-dereference, recibo una advertencia en la declaración de devolución de la lambda:
error: potential null pointer dereference [-Werror=null-dereference] 139 | return std::get<0>(t) > bar; | ~~~~~~~~~~~~~~~^~~~~Curiosamente, cuando la tupla se pasa a la lambda por valor en lugar de por referencia, la advertencia desaparece:
auto firstGreater = std::find_if(foo.begin(), foo.end(), [bar](auto t) { return std::get<0>(t) > bar; });Estoy tratando de entender por qué ese sería el caso, ya que una referencia no puede apuntar a nada, pero no puede descubrir la raíz del problema. ¿Alguna idea de por qué podría pasar esto?
Nota : el fragmento anterior es solo una muestra, pero refleja la esencia de lo que sucede en el código real. Aunque puede que no sea suficiente con reproducir el aviso