未定义Lambda复制分配运算符

时间:2019-06-01 15:15:45

标签: c++ clang c++17

为什么它不能在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;

所有可用的示例代码here

lambda之间有什么区别?

1 个答案:

答案 0 :(得分:3)

正如评论中提到的@ 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链接中的代码示例。