Извинения, если это было покрыто в другом месте. Одно из моих разочарований было то, что всякий раз, когда я пытаюсь проверить постусловие вызова функции, я часто должен декорировать возвращаемую переменную как неиспользуемую, чтобы избежать предупреждений компилятора:
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]];
Или это поведение, определяемое реализацией?