C++ 不可复制的 lambda 行为可复制?
C++ non-copyable lambda behaves copyable?
为什么下面的代码可以编译?
#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 是不可复制的,因为当我尝试像这样复制它时:
auto copy = lambda;
这给了我一个编译错误(如我所料)。 lambda 和复制可构造性特征是否有一些例外?
请参阅 link 以获取神栓示例:
https://godbolt.org/z/GByclH
编辑:
确定 lambda 在尝试复制时是否会编译的正确方法是什么。我想我对给定可调用对象的理论副本构造性不感兴趣,但对成功的副本构造的检测不感兴趣。 vector拷贝构造函数这样定义我还是觉得很奇怪
Is there some exception for lambda's and copy constructability traits?
没有。如果你测试 std::is_copy_constructible<std::vector<std::unique_ptr<int>>>::value
你会发现它也是如此。
原因是 std::vector
具有可访问且未删除的复制构造函数,即使元素类型是不可复制的。如果复制构造函数被实例化,它将无法编译,但那是在直接上下文之外,因此无法被 std::is_copy_constructible
特征检测到。
在元素类型的复制可构造性上创建 std::vector
SFINAE 的复制构造函数可能很诱人,但我相信它会破坏将类型本身的向量存储为成员的类型: struct Node { std::vector<Node> children; }
,因为在这种情况下,Node
和 std::vector<Node>
的复制可构造性将相互依赖。
为什么下面的代码可以编译?
#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 是不可复制的,因为当我尝试像这样复制它时:
auto copy = lambda;
这给了我一个编译错误(如我所料)。 lambda 和复制可构造性特征是否有一些例外?
请参阅 link 以获取神栓示例: https://godbolt.org/z/GByclH
编辑:
确定 lambda 在尝试复制时是否会编译的正确方法是什么。我想我对给定可调用对象的理论副本构造性不感兴趣,但对成功的副本构造的检测不感兴趣。 vector拷贝构造函数这样定义我还是觉得很奇怪
Is there some exception for lambda's and copy constructability traits?
没有。如果你测试 std::is_copy_constructible<std::vector<std::unique_ptr<int>>>::value
你会发现它也是如此。
原因是 std::vector
具有可访问且未删除的复制构造函数,即使元素类型是不可复制的。如果复制构造函数被实例化,它将无法编译,但那是在直接上下文之外,因此无法被 std::is_copy_constructible
特征检测到。
在元素类型的复制可构造性上创建 std::vector
SFINAE 的复制构造函数可能很诱人,但我相信它会破坏将类型本身的向量存储为成员的类型: struct Node { std::vector<Node> children; }
,因为在这种情况下,Node
和 std::vector<Node>
的复制可构造性将相互依赖。