【发布时间】:2020-10-21 14:36:04
【问题描述】:
我的编译器 Visual Studio 19 显示“尝试引用已删除的函数”:
class AClass
{public:
AClass(const AClass& other) = delete;
AClass() {}
AClass(AClass&& other) { }
AClass& operator=(const AClass& other) = delete;
AClass& operator=(AClass&& other) { return *this; }
int member;
};
void main()
{
AClass a;
AClass& aRef = a;
[=]() { return aRef.member; }; // "Attempting to reference a deleted function"
}
我假设它正在尝试调用已删除的复制构造函数,但我不明白为什么我试图通过 [=] 值的引用捕获,这意味着我不复制对象 AClass,我看不到任何副本是如何涉及的。我的理解是 lambda 看起来像这样:
struct lambda {
AClass& refToAClass; // <--- this is the captured object
lambda(AClass& captureVariable) : refToAClass(captureVariable) {}
int operator()() const
{
return refToAClass.member;
}
};
void main()
{
// AND I CAN CONSTRUCT THE LAMBDA, NO COPYING OF AClass INVOLVED
AClass a;
AClass& aRef = a;
lambda lam(aRef); // WORKS FINE
}
本案如何涉及副本?以及如何获取该引用?
【问题讨论】:
-
如果你想通过引用捕获为什么不使用
[&]()而不是[=]()? -
"按 [=] 值引用捕获" -> "按 [=] 值捕获引用" ?这是笔误吗?
-
引用只是对象的另一个名称。您的 lambda 按值捕获所有内容,包括该对象,无论其名称如何。
-
@CoryKramer 因为在调用 lambda 函数时该特定引用将超出范围,所以我很确定。如果我通过引用来捕获引用,那么一旦函数退出,引用就会失效,对吧?
-
这里解释一下是怎么回事:stackoverflow.com/questions/19676473/…因为不能复制所以不行。