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

Daw*_*dPi 10 c++ standards enums namespaces

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

Tre*_*key 12

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

enum OperationMode {
  OM_Invalid,
  OM_Normal,
  OM_Terrified __attribute__((deprecated)),
  OM_AbortOnError __attribute__((deprecated)) = 4
};
Run Code Online (Sandbox Code Playgroud)

一旦枚举和命名空间支持属性,就会有一种实现类似功能的标准交叉编译方式:

enum OperationMode {
  OM_Invalid,
  OM_Normal,
  OM_Terrified [[deprecated("re-named to invalid")]],
  OM_AbortOnError  [[deprecated("exceptions are used instead")]] = 4
};
Run Code Online (Sandbox Code Playgroud)

有一天,其他属性可能会发现与命名空间和枚举值的相关性,但正如提案编写者所述:

本文建议通过允许在枚举器和名称空间上指定属性来解决这些问题,并扩展[[deprecated]]属性以应用于这些实体,如最初的预期.