ошибка: неверная инициализация неконстантной ссылки типа 'std :: function <void ()> &' из значения типа 'main () :: <lambda ()>' | - PullRequest
0 голосов
/ 15 ноября 2018

РЕДАКТИРОВАТЬ : Извините, я задал этот вопрос без тщательного понимания ссылок ...

Кажется, я получаю эту ошибку при запуске этого кода ...

ошибка: неверная инициализация неконстантной ссылки типа 'std :: function &' из значения типа 'main () ::'

#include <bits/stdc++.h>
using namespace std ;

void printfunction(bool a, function <void()> &b) 
{ 
    if (a == true) 
    {
        b() ; 
    }
} 

int main() 
{
    int value = 45 ;    

    printfunction(true, [value](){cout << "The value is : " << value ;}) ; 
}

Ноошибка исчезает , когда я добавляю const перед функцией ... вот так:

void printfunction(bool a,const function <void()> &b) 

Дело в том, что я хотел бы изменить функцию в справочнике функций, если это необходимо ... Есть ли другой способ сделать это?Пожалуйста, дайте мне знать, если это действительно существует.

PS: я использую Code :: Blocks 16.01

Пока,

Самуил

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Если вы хотите изменить std::function, вам нужно будет передать изменяемый (lvalue) параметр:

int main()
{
    int value = 45;

    std::function f = [value](){ std::cout << "The value is : " << value ;};

    printfunction(true, f);
}

То, что вы пытались сделать, мало чем отличается от написанияфункция, которая принимает изменяемую ссылку на int (например, void foo(int& x)), а затем жалуется, что вы не можете вызвать foo(5).(Небольшое отличие состоит в том, что лямбда-выражение преобразуется во временное std::function - но это все равно не может быть привязано к неконстантной ссылке).


Альтернативой может бытьизмените printfunction так, чтобы он принимал аргумент по значению , а не по ссылке, чтобы у него была собственная копия, которую он может изменить.Вам нужно будет учесть потребности вызывающего абонента, чтобы решить, является ли это более подходящим.

0 голосов
/ 15 ноября 2018

При вызове printfunction аргумент лямбда-выражения [value]() {...} должен быть сначала преобразован во временный function<void()> объект.

Ссылка на неконстантный function<void()>& привязывает только к l-значениям, а не к временным значениям (r-значениям).

Ссылка на const, с другой стороны, может быть связана с временными. Что вы наблюдаете.

...