#include <utility>
void f(auto const& fn1)
{
{
auto fn2 = std::forward<decltype(fn1)>(fn1);
auto fn3 = std::forward<decltype(fn2)>(fn2); // ok
fn3();
}
[fn2 = std::forward<decltype(fn1)>(fn1)]
{
auto const fn3 = fn2;
auto fn4 = std::forward<decltype(fn3)>(fn3); // ok
fn4();
auto fn5 = std::forward<decltype(fn2)>(fn2); // error
fn5();
}();
}
int main()
{
f([] {});
}为什么 std::forward 不工作在羔羊身上?
更新信息:
g++很好,但是clang++拒绝它。谁是对的?
发布于 2021-12-03 11:32:20
拒绝它是正确的。
decltype(fn2)给出了fn2的类型,假设lambda闭包类型是T,那么它就是T。lambda的函数调用操作符是const-合格的,那么std::forward<decltype(fn2)>(fn2)就不能被调用.std::forward的模板参数显式地指定为T,那么std::forward<decltype(fn2)>应该接受T& (和T&&)作为它的参数类型,但是const fn2不能绑定到non。
作为解决办法,您可以将lambda标记为mutable。
[fn2 = std::forward<decltype(fn1)>(fn1)] mutable
{
auto fn3 = std::forward<decltype(fn2)>(fn2); // fine
fn3();
}();发布于 2021-12-03 11:15:07
lambda的捕获是闭包类的成员,主体是operator() const。
您正试图在const成员函数中移动类的数据成员,这正是编译器错误告诉您的。
note: candidate function template not viable: 1st argument ('const (lambda at <source>:20:7)') would lose const qualifierhttps://stackoverflow.com/questions/70213317
复制相似问题