Оператор присваивания лямбда-копии не определен - PullRequest
5 голосов
/ 01 июня 2019

Почему это не компилируется с CLang 7 и ниже, но компилируется с CLang 8 и выше:

#include <map>
#include <string>

typedef std::map<std::string, int> TestMap;

TestMap m {
    {"a", 1},
    {"b", 2},
    {"c", 3},
};

auto func = [](const TestMap::value_type & p) -> int { return p.second; };
auto func1 = func;
//In CLang 7 and lower copy assignment operator is not defined
func = func1;

что на самом деле изменилось?

Но это компилируется со всеми версиями CLang:

auto func1 = []() { return 5;};
decltype(func1) func2 = func1;
func2 = func1;

Весь пример кода доступен здесь

В чем разница между лямбдами?

1 Ответ

3 голосов
/ 01 июня 2019

Как уже упоминалось в комментариях @ rafix07, вы должны скомпилировать стандарт C ++ 20.

стандарт до C ++ 20:

ClosureType& operator=(const ClosureType&) = delete; (until C++20)

Если захват не указан, тип закрытия имеет дефолтную копию оператор присваивания и заданное по умолчанию перемещение оператор. В противном случае он имеет оператор присваивания удаленной копии (это включает в себя случай, когда есть захват по умолчанию, даже если он не на самом деле захватывать что угодно). (начиная с C ++ 20)

Оператор назначения копирования определен как удаленный (и перемещение оператор присваивания не объявлен). Типы закрытия не CopyAssignable. (до C ++ 20) ClosureType :: operator = (const ClosureType &)

ClosureType& operator=(const ClosureType&) = delete; (until C++20)

ClosureType& operator=(const ClosureType&) = default; (since C++20) 
ClosureType& operator=(ClosureType&&) = default; (only if no captures are specified)

ClosureType& operator=(const ClosureType&) = delete; (since C++20) 
(otherwise) 

https://en.cppreference.com/w/cpp/language/lambda

см. Компиляцию здесь: https://godbolt.org/z/jpCYNQ

образец кода взят по ссылке @Alexey Starinsky в комментариях.

...