Lig*_*ica 4 c++ templates language-lawyer c++11 c++14
请考虑以下两个引号:
[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]:如果在需要完全定义的对象类型的上下文中使用类类型,或者如果类类型的完整性可能影响程序的语义,则会隐式实例化类模板特化.[..]
我不认为报价实际上是冲突的.帕.1表示静态成员的声明是实例化的,但定义不是.帕.8表示该成员未实例化.由于某事物的非定义声明不是真的那样,我会说他们说同样的话.帕.或许可以澄清8也包括"定义"一词.
以下是一些引用我相信支持我对Par.8的推理(尽管不幸的是它们都不是一个明确的证据):
14.7/2 ... 从类模板的成员定义实例化的类模板的成员函数,成员类,成员枚举或静态数据成员分别被称为实例化成员函数,成员类,成员枚举或静态数据成员....
14.7.1/2除非已经显式实例化或明确专门化了类模板或成员模板的成员,否则在需要成员定义存在的上下文中引用特化时,将隐式实例化成员的特化 ; 特别是,除非静态数据成员本身以需要静态数据成员的定义存在的方式使用,否则不会发生静态数据成员的初始化(以及任何相关的副作用).
(全部取自C++ 11,重点是我的)
对我来说,这些暗示"实例化静态数据成员"实际上意味着"实例化静态数据成员的定义 ".