考虑以下两个引号:
[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]:
如果在需要完全定义的对象类型的上下文中使用类类型,或者如果类类型的完整性可能影响程序的语义,则会隐式实例化类模板特化。 [..]
答案 0 :(得分:5)
我不认为报价实际上是冲突的。帕。 1表示静态成员的声明是实例化的,但定义不是。帕。 8表示该成员未实例化。由于某事物的非定义声明不是真正的某事,我会说他们说同样的事情。帕。或许可以澄清8也包括“定义”这个词。
以下是一些引用,我相信支持我对Par.8的推理(尽管不幸的是,它们都不是一个明确的证明):
14.7 / 2 ...成员函数,成员类,成员枚举, 或者从类模板的成员定义实例化的类模板的静态数据成员 分别被称为实例化成员函数,成员类,成员枚举或静态数据 构件即可。 ...
14.7.1 / 2 除非已明确实例化或明确实例化了类模板或成员模板的成员 专业化,当引用特化时,成员的特化是隐式实例化的 在需要成员定义存在的上下文中;特别是,初始化(和任何相关的 除非静态数据成员本身以某种方式使用,否则不会发生静态数据成员的副作用 这需要静态数据成员的定义存在。
(全部来自C ++ 11,强调我的)
对我而言,这些暗示“实例化静态数据成员”实际上意味着“实例化静态数据成员的定义。”