C++ 为什么C++;17向名称空间和枚举器添加属性?

C++ 为什么C++;17向名称空间和枚举器添加属性?,c++,enums,namespaces,standards,C++,Enums,Namespaces,Standards,正如问题所述,我知道在C++17中会有名称空间和枚举数的属性。这将如何影响我们的代码?这些属性是什么?它们允许我们做什么?我找不到任何好的资源来理解这个新特性。目前,如果要降低某个特定的枚举值,则需要依赖编译器扩展。例如,在clang中,您可以通过以下方式指定不推荐使用的枚举值: enum OperationMode { OM_Invalid, OM_Normal, OM_Terrified __attribute__((deprecated)), OM_AbortOnError

正如问题所述,我知道在C++17中会有名称空间和枚举数的属性。这将如何影响我们的代码?这些属性是什么?它们允许我们做什么?我找不到任何好的资源来理解这个新特性。

目前,如果要降低某个特定的枚举值,则需要依赖编译器扩展。例如,在clang中,您可以通过以下方式指定不推荐使用的枚举值:

enum OperationMode {
  OM_Invalid,
  OM_Normal,
  OM_Terrified __attribute__((deprecated)),
  OM_AbortOnError __attribute__((deprecated)) = 4
};
一旦枚举和名称空间支持属性,就会有一种标准的跨编译器方式来实现类似的功能:

enum OperationMode {
  OM_Invalid,
  OM_Normal,
  OM_Terrified [[deprecated("re-named to invalid")]],
  OM_AbortOnError  [[deprecated("exceptions are used instead")]] = 4
};
有一天,其他属性可能会与名称空间和枚举值相关,但正如提案作者所说:

本文建议通过允许属性 在枚举数和命名空间上指定,并扩展 [[deprecated]]属性应用于这些实体,与最初一样 有意的


现在,您可以使用属性来弃用名称空间或枚举。这些属性和现在存在的属性是一样的,就这样?只有命名空间/枚举的弃用才可用?如果您希望新属性标准化,请建议它们。像GCC和Clang这样的编译器比为数不多的标准编译器支持更多。不管怎么说,你可以阅读这篇文章来寻找动机。我还必须修改我以前的评论;我说的是枚举数,但我应该说是枚举数。我不认为这个问题应该结束。答案提供了我在其他地方很难(以人类可读的方式)找到的信息。