在C++11中弃用静态类成员

3

我遇到了不同的宏,可以使成员属性和函数过时,但没有一个讨论使静态类成员过时的可能性。

我读到即使在C++14中,静态成员的过时也是不允许的。

这是否有任何特定的原因?


当静态成员被废弃时,你会建议在哪里发出警告? - user975989
C++14实际上有一个标准属性用于弃用,但为什么无法弃用静态成员对我来说不是很清楚。 - Peter - Reinstate Monica
@user975989 在类定义中允许声明会有问题吗? - Peter - Reinstate Monica
@PeterA.Schneider 我的观点是在哪些使用情况下应该发出警告?例如,如果我们弃用静态成员foo,当我们调用一个带有foo作为参数的函数时,是否应该发出警告?如果我们调用foo的成员函数呢?对我来说,发出弃用函数的警告似乎比类成员更加明确。 - user975989
请注意,您可以非常好地淘汰非静态成员,这将会有您提到的问题(尽管我不确定我是否理解了全部问题)。我的意思是,您淘汰一个成员--每次使用该成员时都会收到警告。静态或非静态只是语义上的区别,对于确定是否应发出警告并不重要。 - Peter - Reinstate Monica
1个回答

8

让我们了解一些事实:

[[deprecated]]属性的措辞如下(基于N4269 7.6.5 [dcl.attr.deprecated],强调我的部分):

  1. 该属性可应用于类、typedef名称、变量非静态数据成员函数、命名空间、枚举、枚举器或模板特化的声明。

误导的部分是在这个列表中明确出现了“非静态数据成员”,但在同一级别上没有它的对应项,在该列表中还有两个其他有趣的元素。

  • variable的描述如下(基于3 [basic]):
  1. 引入一个变量的方式是声明一个引用,而不是一个非静态数据成员或对象。如果有任何变量名称,则表示该引用或对象。
这意味着说“变量”包括静态数据成员。
- 静态成员函数是一个函数(红色汽车是一辆汽车,这是一个逻辑结论,标准中似乎没有任何反对这一点的东西)。 - 没有特别适用于静态成员的语法或行为问题,静态函数基本上是命名空间中的自由函数,而静态数据成员则更像是命名空间中的全局变量,您可以弃用自由函数和全局变量。 - 作为奖励,它实际上在主要编译器中运行。
总结所有这些事实基本上意味着,[[deprecated]] 属性实际上可以应用于静态数据成员、非静态数据成员和静态成员函数等内容。
因此,根据我的理解,标准实际上允许废弃静态成员。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接