C++ C++;不可复制lambda的行为是否可复制?
为什么要编译下面的代码C++ C++;不可复制lambda的行为是否可复制?,c++,lambda,typetraits,C++,Lambda,Typetraits,为什么要编译下面的代码 #include <memory> #include <vector> int main() { std::vector<std::unique_ptr<int>> uncopyableStuff; for(int i = 0; i < 5; ++i) uncopyableStuff.emplace_back(std::make_unique<int>(i)); a
#include <memory>
#include <vector>
int main()
{
std::vector<std::unique_ptr<int>> uncopyableStuff;
for(int i = 0; i < 5; ++i)
uncopyableStuff.emplace_back(std::make_unique<int>(i));
auto lambda = [uncopyableStuff = std::move(uncopyableStuff)](){};
static_assert(std::is_copy_constructible<decltype(lambda)>::value);
}
这给了我一个编译错误(正如我所预料的)。lambda和copy可构造性特征是否有例外
请参阅连杆以了解锁紧螺栓示例:
编辑:
当尝试复制时,找出lambda是否将编译的正确方法是什么。我对给定可调用函数的理论拷贝可构造性不感兴趣,而是对成功拷贝构造的检测。向量副本构造函数是这样定义的,这对我来说仍然很奇怪
lambda和copy可构造性特征是否有例外
不。如果您测试
std::is\u copy\u constructible::value
,您会发现它也是正确的
原因是
std::vector
具有可访问且未删除的复制构造函数,即使元素类型是不可复制的。如果复制构造函数被实例化,它将无法编译,但这超出了直接上下文,因此无法被std::is\u copy\u constructible
特征检测到
在元素类型的复制可构造性上创建
std::vector
SFINAE的复制构造函数可能很有诱惑力,但我相信它会破坏将类型本身的向量存储为成员的类型:struct Node{std::vector children;}
,因为在这种情况下,Node
和std::vector
的副本可构造性是相互依赖的。std::is\u copy\u constructible::value
为true,因为std::vector
具有未删除的副本构造函数。该构造函数的主体当然格式不正确(因为它调用std::unique_ptr
的复制构造函数),但这不在直接上下文范围内,因此无法通过类型特征检测到它;编译器(现在?)没有任何方法可以通过false
从任意错误中“恢复”并从所需测试中恢复。这是一个有趣的问题。SFINAE不能用于这样的自引用。概念能做到吗,因为它是SFINAE的一种合法语言版本?
auto copy = lambda;