Скажем, у вас была такая функция:
void* allocate(std::size_t sz, void* hint = nullptr) {
// if you give `hint` it *might* be more efficient
}
А потом вы решили, что больше не стоит пытаться делать вещи, основанные на hint
. Итак, вы бы сделали это:
void* allocate(std::size_t sz, [[deprecated]] void* hint = nullptr) {
// `hint` is ignored. The compiler warns me if I use it in the
// function body accidentally, and people reading the function
// signature can see that it is probably going to be ignored.
}
Это позволяет библиотеке сохранять ту же сигнатуру/ABI (поэтому вам не нужно перекомпилировать материал, который ее использует, и унаследованный код может по-прежнему использовать ее, не причиняя никакого вреда), а также предотвращает ее случайное повторное использование при изменении функция.
Но это в основном для разработчиков функции, а не для пользователей функции, в будущем, чтобы они знали, почему существует кажущийся «бесполезным» параметр.
Я также думаю, что это отключит предупреждение «неиспользуемый параметр» с флагом -Werror=unused-parameter
в gcc/clang, но это не так. Использование (void) deprecated_parameter
также выдает предупреждение об использовании устаревшего параметра, так что это похоже на ошибку. Если бы он отключил предупреждение о неиспользуемом параметре, это был бы еще один вариант использования [[deprecated]]
.
person
Artyer
schedule
28.05.2019
void f([[deprecated]] int n = 0); void g() { f(); f(2); }
. Он только предупреждает в теле функции. - person aschepler   schedule 28.05.2019