Есть ли недостатки в использовании [[might_unused]] для переменных, используемых только в утверждениях? - PullRequest
2 голосов
/ 26 мая 2020

Если переменная используется только в assert, компиляторы обычно выдают предупреждение, когда программа компилируется в режиме выпуска (т.е. без флагов отладки). Этот вопрос предлагает способы отключить эти конкретные предупреждения. Среди ответов предлагается атрибут C ++ 17 maybe_unused. Тем не менее, эти ответы на самом деле не обсуждались. предупреждение о том, что i не используется в сборке выпуска?

1 Ответ

0 голосов
/ 20 июля 2020

Проблема с таким предложением состоит в том, что они могут вызвать некоторые накладные расходы без предупреждения, особенно после некоторого рефакторинга.

Только содержимое / выражение внутри утверждения обычно полностью удаляется в сборках выпуска.

Если вы хотите использовать переменные в своем утверждении, вы можете использовать лямбды. См. Этот пример:

#include <cassert>

auto get_i(){
    return 5;
}

int main(){
    /* BAD
    [[maybe_unused]] const auto i = get_i();
    assert(i == 5);
    */
    
    assert([&](){
        const auto i = get_i();
        return i == 5;
    }());
}
...