gpt4 book ai didi

c++ - 何时检查 C++ 模板实例化类型?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:28:40 24 4
gpt4 key购买 nike

在编译 C++ 时,gcc 和 clang 似乎将模板实例化的类型检查推迟到程序的所有声明都已处理之后。这在语言中有保证吗?

详细来说,我可以在定义模板或需要模板实例化的地方保持类型不完整,只要我稍后在程序的某个地方完成类型:

class A;
class B;

extern A* pa;

// 1. template definition
template<typename T>
T* f() { return static_cast<T*>(pa); }

// 2. template instantiation
B* test() { return f<B>(); }

// 3. completing types
class A { };
class B : public A { };

请注意,需要 A 和 B 的定义来对模板实例化进行类型检查(以使 static_cast 有效)。如果省略第 3 步,第 2 步将不再编译。

在头文件的组织中,我能否相信此顺序将被任何标准 C++ 编译器接受?

最佳答案

该规则称为“两阶段名称查找”。

不依赖于模板参数的名称在定义时被查找和检查,相关名称在实例化时被检查。

对于你的例子,有一个重要的细节:翻译单元的结尾也被认为是函数模板的实例化点:

C++14 N4140 14.6.4.1 [温度点] P8:

A specialization for a function template, a member function template, or of a member function or static data member of a class template may have multiple points of instantiations within a translation unit, and in addition to the points of instantiation described above, for any such specialization that has a point of instantiation within the translation unit, the end of the translation unit is also considered a point of instantiation.

因此,尽管在发生显式实例化的点“2”处类型不完整,但它在文件末尾是完整的,这使得模板实例化合法。

注意:微软编译器没有完全实现这个规则,违反了标准。在 Microsoft 编译器中,所有查找都发生在实例化时(因此该示例也应该有效,但我无权访问 MSVC 进行检查)。其他主要编译器确实正确地实现了这条规则。

关于c++ - 何时检查 C++ 模板实例化类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34204483/

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