【发布时间】:2019-04-12 16:48:07
【问题描述】:
为什么下面的代码会编译?
#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 和复制可构造性特征是否有一些例外?
查看godbolt示例的链接: https://godbolt.org/z/GByclH
编辑:
在尝试复制时找出 lambda 是否会编译的正确方法是什么。我猜我对给定可调用对象的理论复制构造性不感兴趣,而是对成功复制构造的检测感兴趣。向量拷贝构造函数是这样定义的,我还是觉得很奇怪。
【问题讨论】:
-
std::is_copy_constructible<decltype(lambda)>::value为真,因为std::vector<std::unique_ptr<int>>有一个未删除的复制构造函数。该构造函数的主体当然是格式错误的(因为它调用了std::unique_ptr的复制构造函数),但这超出了直接上下文,因此类型特征无法检测到它。 -
重新“编辑”:一般情况下无法确定是否可以编译;编译器(还没有?)有任何方法可以从任意错误中“恢复”并使用
false从您想要的测试中恢复。
标签: c++ lambda typetraits