gpt4 book ai didi

c++ - C++ 17中静态成员lambda函数中未定义的类类型

转载 作者:行者123 更新时间:2023-12-01 14:49:53 24 4
gpt4 key购买 nike

前一段时间,我试图实现自己的v表(出于教育目的)。为此,我使用了函数指针和lambda。这样做时,我偶然发现了一个问题。我没有写整个v-table代码,而是编写了一个Minimal Reproducible Example。

由于某些原因,它无法编译(C2027-使用未定义的类型Test):

class Test
{
int n;
static inline auto f = [](Test* t)
{
return t->n;
};
};

即使我像这样向前声明 Test: class Test;

我很好奇是什么导致了这种现象,因为 int nclass Test都在lambda之前声明了。

我正在将最新的Visual Studio 2019与C++ 17一起使用。

最佳答案

Test在lambda之前声明,但未定义。当您执行};时,类定义仅在类本身的末尾完成。在此之前,它是一个不完整的类型。

并且您不能访问不完整类型的成员。或者至少,不是像在lambda中那样通过对象实例进行操作(您可以在那时谈论Test::n,但不能接受Test*并对其进行->n)。

现在,您可能会说,如果将f设为普通的静态成员,则可以轻松地在其中放置类的定义,并且该类的定义将起作用。这是因为C++对于定义类的成员函数有一条特殊的规则。即,这些函数的主体被视为已定义,就好像它们放在类定义之后一样。因此,他们可以在内部使用类,就好像它是完整类型一样,因为这些函数体将在它们是完整类型的地方定义。

您的lambda不是成员函数;这是分配给类静态变量的lambda函数。静态变量的初始化程序没有得到这种特殊处理,因此Test在lambda函数体内部被视为不完整。

关于c++ - C++ 17中静态成员lambda函数中未定义的类类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58454298/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com