gpt4 book ai didi

c++11 - 模板成员函数中的 lambda 错误

转载 作者:行者123 更新时间:2023-12-02 10:51:05 25 4
gpt4 key购买 nike

我有以下 C++ 代码

#include <iostream>

template<typename Func>
class Foo
{
private:
Func func;

public:
Foo(Func func) : func(func) {}

template<typename T>
Func wrap()
{
Func clbk = func;
auto wrapperCB = [clbk](T t) {
auto job = [clbk, t](){
clbk(t);
};
job();
};

return wrapperCB;
}

template<typename T>
void call(T t)
{
func(t);
}
};

int main()
{
int m = 2;
auto f = [](int & p) {std::cout << "test success " << p << "\n";};
auto obj = std::make_shared<Foo<std::function<void(int &)>>>(f);
auto wrapper = obj->template wrap<int &>();
wrapper(m);
return 0;
}

这给出了编译错误
tsavs-mbp:p utsagarw$ clear; g++ -std=c++11 a.cpp -o z; ./z
a.cpp:18:17: error: no matching function for call to object of type 'const std::__1::function<void (int &)>'
clbk(t);
^~~~
a.cpp:38:32: note: in instantiation of function template specialization 'Foo<std::__1::function<void (int &)> >::wrap<int &>' requested here
auto wrapper = obj->template wrap<int &>();
^
/Applications/Xcode_10.1/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/functional:1677:9: note: candidate function not viable: 1st argument ('const int') would lose const qualifier
_Rp operator()(_ArgTypes...) const;
^
1 error generated.

我不明白这个错误。这个 const 是从哪里来的?

如果在 wrap 中,则构建成功我不创建 job仿函数和调用 clbk直接地。这是什么 jobtype T ?
template<typename T>
Func wrap()
{
Func clbk = func;
auto wrapperCB = [clbk](T t) {
clbk(t);
};

return wrapperCB;
}

最佳答案

如果要修改 lambda 中的任何捕获变量,必须将其指定为 mutable .
t变量是通过副本捕获的,因此您只能读取它:

         auto job = [clbk, t]()  // <-- t passed by copy
{
clbk(t); // clbk takes t by reference -> int&
};

您的回电, clbk有签名 int&所以这意味着它可以修改 t .什么是不允许的。

解决方案:
         auto job = [clbk, t]() mutable // keyword 'mutable' added
{
clbk(t); // clbk can change t
};

或制作 function服用 const int&作为参数 - 然后 t只能读取。

Demo

关于c++11 - 模板成员函数中的 lambda 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60439682/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com