std ::函数作为&]发送的(非)const输入参数>

问题描述 投票:0回答:1

我不知道为什么将std::function<...(...)> &作为输入参数传递给函数时需要指定为const。 AFAIK无法更改它,对不对?这是一个可以编译并正常运行的示例。如果删除const限定符,则会出现错误:

#include <iostream>
#include <functional>

//int foo(std::function<int(int)> &f)
int foo(const std::function<int(int)> &f)
{
    return f(6);
}
int main(int argc, char **argv)
{
    auto f1 = [=](int i){ if (i<5) {return 8*2;} else {return 2;} };
    auto f2 = [=](int i){ if (i>3) {return i*i;} else {return 2;} };
    std::cout << foo(f1) << "\n";
}

当我使用不带const的声明时,出现以下错误:

main.cpp: In function ‘int main(int, char**)’:
main.cpp:13:21: error: cannot bind non-const lvalue reference of type ‘std::function<int(int)>&’ to an rvalue of type ‘std::function<int(int)>’
  std::cout << foo(f1) << "\n";
                     ^
In file included from /usr/include/c++/7/functional:58:0,
                 from main.cpp:2:
/usr/include/c++/7/bits/std_function.h:685:7: note:   after user-defined conversion: std::function<_Res(_ArgTypes ...)>::function(_Functor) [with _Functor = main(int, char**)::<lambda(int)>; <template-parameter-2-2> = void; <template-parameter-2-3> = void; _Res = int; _ArgTypes = {int}]
       function<_Res(_ArgTypes...)>::
       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
main.cpp:4:5: note:   initializing argument 1 of ‘int foo(std::function<int(int)>&)’
 int foo(std::function<int(int)> &f)
     ^~~

我想知道为什么std :: function <...>&作为输入参数传递给函数时需要指定为const。 AFAIK无法更改它,对不对?这是一个示例,......>

c++ reference const std-function
1个回答
1
投票

lambda不是std::function,但是可以从lambda创建std::function。当您将f1f2传递给foo()时,编译器必须构造一个临时的std::function对象以提供给f参数。但是,对非const对象的lvalue引用不能绑定到临时对象,正如错误消息所言。

为了允许传递临时对象,必须通过以下任一方法将f参数更改为采用std::function

© www.soinside.com 2019 - 2024. All rights reserved.