类模板的静态成员是隐式实例化的还是不是?

问题描述:

考虑以下两个引号:类模板的静态成员是隐式实例化的还是不是?

[C++11: 14.7.1/1]:[..]类模板专业化的隐式实例引起的声明中的隐式实例,但没有定义或默认参数,因此类成员函数,成员类,成员范围成员枚举,静态数据成员和成员模板; [..]

[C++11: 14.7.1/8]:类模板不会导致那个类的任何静态数据成员被隐式实例化的隐式实例。

(也分别发现逐字—除了一个新的参考异常规格—在[C++14: 14.7.1/1][C++14: 14.7.1/9]

缺少什么我在这里?隐式实例化类模板并隐式实例化类模板专业化之间有什么区别?这两个引号如何不冲突?

[C++11: 14.7.1/5]:类模板专业化如果类型是在需要完全定义的对象类型,或者如果类类型的完整性可能影响程序的语义的上下文中被隐式实例化。 [..]

+2

除非我误读,否则他们听起来不像是冲突。第一个引用的内容如下:“...引起声明的隐式实例化,而不是** ...静态数据成员”。第二个报价也是这样说的。 – CoryKramer 2014-10-31 11:05:44

+0

@Cyber​​:我认为你在误读。那将是一个非常奇怪的句子结构,它并没有任何意义:“_what_的声明”?相反,我认为第一个引号说明的声明(但不是定义)都被隐含地实例化了。第二个引号表示不会被隐式实例化。最简单的解决方案是Angew说的:第二个报价缺少限定词“定义”。但仅此而已,它缺少了,所以现在引号冲突。 – 2014-10-31 11:07:14

+1

噢好吧,我认为“但不是”适用于声明的其余部分,但在重新阅读后,情况并非如此。 – CoryKramer 2014-10-31 11:09:31

我不认为引号实际上是冲突的。帕。 1表示静态成员的声明被实例化,但定义不是。帕。 8表示该成员没有实例化。由于一个非定义的东西声明并不是真的,东西,我会说他们说同样的事情。帕。 8也许可以澄清,也包括“定义”一词。

这里有几个报价,我相信支持我对Par.8推理(即使其中没​​有一个是水晶般清晰的证明,可惜):

14.7/2 ..一种成员函数,一个构件类,成员枚举, 或静态数据成员从类模板 的构件定义实例化的类模板的被调用时,分别实例化的成员函数,构件类,成员枚举或静态数据 会员。 ...

14.7。1/2除非类模板或成员模板的成员已明确实例化或明确 专业的专业化成员被隐式实例当专业化要求成员定义的上下文中引用 存在;特别是静态数据成员的初始化(以及任何相关联的 副作用)不会发生,除非静态数据成员本身以需要定义静态数据成员存在的方式使用 。

对我来说,这意味着“实例化一个静态数据成员”的真正含义(所有的C++ 11,重点煤矿采取)“实例化一个静态数据成员的定义。”

+0

听起来很合理。你可以使用任何先前的研究或某些邮件列表讨论或DR或其他方式备份你的声明吗?不是我已经能够找到任何-.- – 2014-10-31 11:07:41

+1

@LightnessRacesinOrbit不是真的,它只是我如何解析英文文本。 (mf,mc,sme,** sdm **,mt)的“instantiate'(Dec &&!(Def || DefArg))' – Angew 2014-10-31 11:13:24

+0

哦,不,那一部分,我在谈论第8段时虽然我同意你的解释,但是在这段文字中没有任何内容可以证明它。 – 2014-10-31 11:15:22