为什么下面的代码可以编译?
#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 和复制可构造性特征是否存在异常(exception)?
查看 godbolt 示例的链接: 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 关于元素类型的复制构造性,但我相信它将破坏将类型本身的 vector 存储为成员的类型:struct Node { std::vector<Node> children; }
,因为在这种情况下, Node
的复制构造性和std::vector<Node>
将是相互依赖的。
关于C++ 不可复制的 lambda 行为可复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55656315/