Атрибут C++: deprecated (начиная с C++14)
Указывает, что имя или сущность, объявленные с этим атрибутом, являются устаревшими, то есть их использование разрешено, но по некоторой причине не рекомендуется.
Синтаксис
[[deprecated]] | (1) | |
[[deprecated( string-literal )]] | (2) |
| string-literal | - | невычисляемый строковый литерал, который можно использовать для объяснения причины устаревания и/или указания заменяющей сущности |
Пояснение
Указывает, что использование имени или сущности, объявленных с этим атрибутом, разрешено, но по некоторой причине не рекомендуется. Компиляторы обычно выдают предупреждения при таком использовании. Если указан string-literal, он обычно включается в предупреждения.
Этот атрибут разрешено использовать в объявлениях следующих имён или сущностей:
-
класса/структуры/объединения, например,
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> {};.
Имя, объявленное неустаревшим, можно повторно объявить устаревшим. Имя, объявленное устаревшим, нельзя сделать снова актуальным, повторно объявив его без этого атрибута.
Пример
#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 [dcl.attr.deprecated]
- Стандарт C++20 (ISO/IEC 14882:2020):
- 9.12.4 Атрибут deprecated [dcl.attr.deprecated]
- Стандарт C++17 (ISO/IEC 14882:2017):
- 10.6.4 Атрибут deprecated [dcl.attr.deprecated]
- Стандарт C++14 (ISO/IEC 14882:2014):
- 7.6.5 Атрибут deprecated [dcl.attr.deprecated]
См. также
Документация по C для deprecated |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/language/attributes/deprecated