Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;不可复制lambda的行为是否可复制?_C++_Lambda_Typetraits - Fatal编程技术网

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;