【发布时间】:2019-06-01 15:15:44
【问题描述】:
为什么这不能用 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 之间有什么区别?
【问题讨论】:
-
好问题。您可能希望将代码包装在一个函数中,以便其他人更容易重现您的结果(
func2 = func1不是全局范围内的有效表达式) -
@CássioRenan 见wandbox.org/permlink/sth5JwOMeEgIW6jM
-
从 C++20 see reference 开始可以复制无状态 lambda。现在输入clang status 并检查c++2a 的状态。 8 版本中的 Clang 支持可分配的无状态 lambda。寻找这篇 Default constructible and assignable stateless lambdas 论文。您附加了启用 c++2a 模式的代码链接。
-
也不用 clang 8 编译。 godbolt.org/z/r5csI3
-
@user10933809 您需要添加
-std=c++2a作为编译器参数。