C++ 属性: deprecated (C++14 起)
来自cppreference.com
< cpp | language | attributes
指示声明有此属性的名字或实体被弃用,即允许但因故不鼓励使用。
语法
[[deprecated]]
|
(1) | ||||||||
[[deprecated( 字符串字面量 )]]
|
(2) | ||||||||
字符串字面量 | - | 能用于解释弃用的理由并/或提议代替用实体的不求值字符串字面量 |
解释
指示允许使用声明有此属性的名称或实体,但因故不鼓励使用。编译器通常会对其使用情况发出警告。若指定了 字符串字面量,则它通常被包含于警告中。
下列名字或实体的声明中允许使用这个属性:
- class/struct/union,例如 struct [[deprecated]] S;,
- typedef 名,也包括别名声明,例如
- [[deprecated]] typedef S* PS;
- using PS [[deprecated]] = S*;,
- (非成员)变量,例如 [[deprecated]] int x;,
- 静态数据成员,例如 struct S { [[deprecated]] static constexpr char CR{13}; };,
- 非静态数据成员,例如 union U { [[deprecated]] int n; };,
- 函数,例如 [[deprecated]] void f();,
- 命名空间,例如 namespace [[deprecated]] NS { int x; },
- 枚举,例如 enum [[deprecated]] E {};,
|
(C++17 起) |
- 模板特化,例如 template<> struct [[deprecated]] X<int> {};。
声明时未弃用的名字可被重声明为 deprecated
。声明为 deprecated
的名字不能通过重声明它而不带此属性变为未弃用。
示例
运行此代码
#include <iostream> [[deprecated]] void TriassicPeriod() { std::clog << "Triassic Period: [251.9 - 208.5] million years ago.\n"; } [[deprecated("Use NeogenePeriod() instead.")]] void JurassicPeriod() { std::clog << "Jurassic Period: [201.3 - 152.1] million years ago.\n"; } [[deprecated("Use calcSomethingDifferently(int).")]] int calcSomething(int x) { return x * 2; } int main() { TriassicPeriod(); JurassicPeriod(); }
可能的输出:
Triassic Period: [251.9 - 208.5] million years ago. Jurassic Period: [201.3 - 152.1] million years ago. main.cpp:20:5: warning: 'TriassicPeriod' is deprecated [-Wdeprecated-declarations] TriassicPeriod(); ^ main.cpp:3:3: note: 'TriassicPeriod' has been explicitly marked deprecated here [[deprecated]] ^ main.cpp:21:5: warning: 'JurassicPeriod' is deprecated: Use NeogenePeriod() instead ⮠ [-Wdeprecated-declarations] JurassicPeriod(); ^ main.cpp:8:3: note: 'JurassicPeriod' has been explicitly marked deprecated here [[deprecated("Use NeogenePeriod() instead")]] ^ 2 warnings generated.
引用
- C++23 标准(ISO/IEC 14882:2024):
- 9.12.5 Deprecated attribute [dcl.attr.deprecated]
- C++20 标准(ISO/IEC 14882:2020):
- 9.12.4 Deprecated attribute [dcl.attr.deprecated]
- C++17 标准(ISO/IEC 14882:2017):
- 10.6.4 Deprecated attribute [dcl.attr.deprecated]
- C++14 标准(ISO/IEC 14882:2014):
- 7.6.5 Deprecated attribute [dcl.attr.deprecated]