考虑以下两个引号:
[C++11: 14.7.1/1]:..类模板专门化的隐式实例化导致类成员函数、成员类、作用域成员枚举、静态数据成员和成员模板的声明(而不是定义或默认参数)的的隐式实例化;[C++11: 14.7.1/8]:类模板的隐式实例化不会导致该类的任何静态数据成员被隐式实例化.
(还分别在[C++14: 14.7.1/1]和[C++14: 14.7.1/9]中找到逐字(除了对异常规范的新引用外)
我在这里错过了什么?隐式实例化类模板和隐式实例化类模板专门化之间有什么区别?这两句话怎么能不冲突呢?
类模板专门化如果类类型在需要完全定义的对象类型的上下文中使用,或者类类型的完整性可能会影响程序的语义,则类模板专门化被隐式实例化。。。
发布于 2014-10-31 11:07:02
我不认为这些引语实际上有冲突。标准杆。1表示静态成员的声明是实例化的,但定义没有实例化。标准杆。8表示该成员没有实例化。既然不明确的声明并不是真的那样,我要说的是他们说的是同样的话。标准杆。[8]也许也可以澄清一下,列入“定义”一词。
以下是我认为支持我对第8段的推理的几句话(不幸的是,它们都不是一个清晰的证据):
14.7/2 .从类模板的成员定义实例化的类模板的成员函数、成员类、成员枚举或静态数据成员分别调用实例化的成员函数、成员类、成员枚举或静态数据成员。..。 14.7.1/2,除非类模板或成员模板的成员已显式实例化或显式专门化,否则当专门化在要求成员定义存在的上下文中引用时,成员的专门化将被隐式实例化;特别是,除非静态数据成员本身被使用的方式要求静态数据成员的定义存在,否则不会发生静态数据成员的初始化(及任何相关的副作用)。
(全部摘自C++11,重点是我)
对我来说,这意味着“实例化静态数据成员”实际上意味着“实例化静态数据成员的定义”。
https://stackoverflow.com/questions/26673081
复制相似问题