Пометить как устаревшие параметры функции в C ++ 14 - PullRequest
12 голосов
/ 28 мая 2019

Чтение этого сообщения в блоге и его комментариев. Я заметил, что в качестве примера приводится возможность помечать определенные параметры функции как устаревшие, как в (пример взят из поста):

// Deprecate a function parameter
int triple([[deprecated]] int x);

Теперь мне стало интересно, каков хороший вариант использования такой функции? Никто в комментариях к этому посту или где-либо еще, что я искал, кажется, не имеет ни малейшего понятия.

EDIT:

Чтобы увидеть это в действии, есть скомпилированный пример на золотом болте

Ответы [ 3 ]

10 голосов
/ 28 мая 2019

Скажем, у вас была такая функция:

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]].

3 голосов
/ 28 мая 2019

Правило состоит в том, что атрибут действителен, помимо прочего, в объявлениях переменных (в целом). Это не разрешено специально для таких объявлений, найденных в аргументах функции.

Исходное предложение, N3394 , также не упоминает такой вариант использования, равно как и документация для оригинальной функции в GCC (которую независимо принимает эквивалентное использование ) или в VS (я не проверял Clang).

Как таковой, я думаю, что это «случайность», что это разрешено, а не то, что кто-то на самом деле считал полезным.

Может ли быть полезным документировать устаревшие аргументы по умолчанию, как исследует Artyer? Да, потенциально и неопределенно. Но, как обнаружил и Артье, основные компиляторы на самом деле не реагируют на это использование полезным способом.

Таким образом, в настоящее время это не полезно, и языковая функция не была специально разработана, чтобы быть полезной в этом случае.

0 голосов
/ 28 мая 2019

Представьте себе библиотеку, которая внедряется, используется и поддерживается в течение многих лет. Эта библиотека используется в нескольких проектах.
Если вы просто удалите параметр, все проекты должны будут немедленно адаптировать исходный код для возможности повторной компиляции после обновления до новой версии библиотеки.
Если к параметру добавлено значение по умолчанию, но этот параметр больше не используется, проекты все равно будут компилироваться без каких-либо изменений, но никто не заметит, что что-то изменилось вообще, и, возможно, какое-то поведение / функция, которой управляет этот параметр, больше не работает.

Таким образом, пометив параметр как устаревший, проекты могут компилироваться без изменений, но они получают предупреждение о том, что что-то изменилось и что им следует изменить свой исходный код, потому что рано или поздно этот параметр исчезнет.

...