尝试了解名称何时在当前实例化中

Trying to understand when a name is in the current instantiation

本文关键字:实例化 何时 了解      更新时间:2023-10-16

我在尝试运行某些代码中的细微错误时遇到了这种情况。

template<typename T>
struct S
{
int f(){ return this->r; }
int g(){ return r; }
};

编译器在S::g的定义上标记了一个错误,即使我从未实例化模板的专用化,这实际上是我所期望的:名称 r 是非限定的,并且未在范围内的任何地方声明。

令我困惑的是,在我实例化一个专业化(例如CT<int>f(并调用其f之前,错误不会S::f的定义上标记

。换句话说,编译器似乎将this视为指向依赖类型的指针,而不是指向当前实例化的指针。

这是对的吗?(我的编译器是 g++ 8.1.0(。如果 g++ 在做正确的事情,你能解释一下吗?

有两种类型的模板代码。 您有依赖和非依赖代码,即依赖于模板参数的代码和不依赖于模板参数的代码。 在

int g(){ return r; }

没有什么取决于T所以编译器检查出代码,看看它无效,你得到一个错误。

int f(){ return this->r; }

r现在取决于T,因为this取决于T。 由于在知道T是什么之前,您无法知道它是否有效,因此代码被"忽略",并且只有在实际实例化后才会收到错误。