C ++ 20 контракты и неиспользованные переменные - PullRequest
10 голосов
/ 09 июля 2019

Извинения, если это было покрыто в другом месте. Одно из моих разочарований было то, что всякий раз, когда я пытаюсь проверить постусловие вызова функции, я часто должен декорировать возвращаемую переменную как неиспользуемую, чтобы избежать предупреждений компилятора:

auto const count [[maybe_unused]] = some_map.erase(some_key);
assert(count == 1);

Причина этого атрибута ясна - assert - это макрос препроцессора, который либо расширяется до отсутствия операции, если установлено NDEBUG, либо фактически вычисляет выражение, если NDEBUG не установлено. В первом случае count технически не используется, поэтому предупреждение компилятора.

С введением контрактов в C ++ 20 будет ли переменная count по-прежнему считаться неиспользованной? Другими словами, смогу ли я сделать:

auto const count = some_map.erase(some_key); // no attribute
[[assert: count == 1]];

или мне придется сделать что-то ужасное, например:

auto const count [[maybe_unused]] = some_map.erase(some_key);
[[assert: count == 1]];

Или это поведение, определяемое реализацией?

1 Ответ

2 голосов
/ 10 июля 2019

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

if(__check_contract<level>())
  if(!condition) __handle_violation(…);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...