【发布时间】:2011-10-11 18:42:26
【问题描述】:
C++ 语言标准规定了标准库中有关模板组件的以下内容:
效果未定义...如果在实例化模板组件时将不完整的类型用作模板参数,除非该组件特别允许 (C++11 §17.6.4.8/2)。
以下是否会导致 std::vector 类模板的实例化?
class X;
std::vector<X> f(); // Declaration only; we will define it when X is complete
换个说法,在函数声明std::vector<X> f();中,std::vector是用参数X实例化的吗?或者,直到 f() 被 odr 使用或定义后,std::vector<X> 才被实例化?
同样,以下是否会导致 std::vector 类模板的实例化?
class X;
typedef std::vector<X> XVector; // We will complete X before we use XVector
虽然我在这些示例中使用 std::vector,但该问题同样适用于所有模板。
【问题讨论】:
-
一个好的答案将提供对 C++ 语言标准的参考。我搜索了语言标准,但找不到明确的答案。
-
我以前从未见过在部分编译过程中使用“未定义”...
-
你为什么想知道?
-
当你评论here时,你为什么确信它确实是在实例化模板组件,有什么想法吗?
-
@jeffamaphone:我想知道,因为我很好奇。此外,因为它具有广泛的实际意义,正如辩论 in the answers and comments to this question 所证明的那样。