Pregunta Lambda pasó a la plantilla no definida


Estaba jugando con la deducción de argumento de plantilla de clase de C ++ 17 hoy. La primera idea obvia que se me ocurrió fue pasar un parámetro de plantilla invocable. Un invocable, que es entre otras cosas un lambda, por qué no. Probemos eso.

template<typename F> class foo
{
F f;
public:
    foo(F in) : f(in) { f(); /* not very useful, admitted */ }
};

void bar() { puts("a"); }

int main()
{
    auto a = foo(bar);
    auto b = foo([](){ puts("b"); });

    return (void) a, (void) b, 0;
}

Esto es lo que tiene que decir clang (5.0, r300688) al respecto:

advertencia: function '<(lambda en [fuente]   ubicación])> 'tiene un enlace interno pero no está definido

El código compila y ciertamente "funciona bien", pero la advertencia sugiere que el compilador no está del todo contento con él.

Estoy listo para aceptar que el lambda tiene un enlace interno (siendo anónimo no se puede acceder a él en otra parte de la misma unidad de traducción, por lo que estoy seguro de que es inaccesible en otro), pero ¿qué pasa con eso? yo no quiero acceder desde otra unidad de traducción.
La parte sobre la falta de definición me parece gracioso, ni siquiera sabría cómo escribir una lambda sin definirla.

En resumen: ¿Qué da? ¿Qué hacer con eso? No me gustan las advertencias, no solo hacen que la construcción sea menos bonita, sino que generalmente significa que algo está mal y un comportamiento indefinido puede morderte pronto. Por otro lado, ¿cómo puedo hacer una lambda más definido de lo que ya es al escribir su definición?


32
2018-04-20 08:30


origen


Respuestas:


Me parece que esto es un error del compilador. Usando el compilador de Clang de Visual Studio 2017 solo se genera este error "no se puede hacer referencia a la plantilla de clase 'foo' sin una lista de argumentos de plantilla" para la creación de instancias ayb en la función principal. Si el tipo de función se especifica como parámetro de plantilla, no hay advertencias ni errores.


1
2017-12-21 06:18



Recientemente me encontré con algunas advertencias sin sentido que se veían y olían, similares a las suyas. Probé varias correcciones de Hand-Wavey con la idea de poder forzar la mano del enlazador (si se quiere), pero al final del día me di cuenta de que estaba intentando compilar el código C ++ 14 con un -std=c++17 bandera. Es posible que desee volver a verificar sus propios indicadores de estándares (y posiblemente su correspondiente -stdlib=… banderas también).


0
2017-12-23 20:20