Lambda函数不会使用不同的签名进行编译

时间:2018-05-13 11:13:27

标签: c++ lambda

我正在尝试c ++ lambda函数:

这有效:

std::function<std::string(std::string)>lambda = [] (std::string message) -> std::string
   {
       return std::string("test");
   };

我可以使用std::cout << lambda(std::string("in"));调用该函数,并打印"test"

但是,如果我传递另一种类型(std::istream),它就不会编译。从std::istream到任何类型的映射(例如字符串)应该是最终目标。我将为此目的使用模板。 :

std::function<std::string(std::istream)>lambda = [] (std::istream message) -> std::string
   {
       return std::string("test");
   };

这是g ++的输出:

g++ -I"/home/***/workspace.cpp/unrealcv-renderer/include" -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/unrealcv_renderer.d" -MT"src/unrealcv_renderer.o" -o "src/unrealcv_renderer.o" "../src/unrealcv_renderer.cpp"
../src/unrealcv_renderer.cpp: In constructor ‘event_camera_simulator::UnrealCVRenderer::UnrealCVRenderer(std::__cxx11::string, std::__cxx11::string)’:
../src/unrealcv_renderer.cpp:23:8: error: conversion from ‘event_camera_simulator::UnrealCVRenderer::UnrealCVRenderer(std::__cxx11::string, std::__cxx11::string)::<lambda(std::istream)>’ to non-scalar type ‘std::function<std::__cxx11::basic_string<char>(std::basic_istream<char>)>’ requested
        };
        ^

这里有什么问题?

1 个答案:

答案 0 :(得分:9)

问题是你传递了std::function<std::string(std::istream&)>lambda = [] (std::istream& message) -> std::string { return std::string("test"); }; 的值,这可能需要一个副本,而且是non-copy-able class

可能的解决方案是通过引用接受:

{{1}}