C ++ 20合约和未使用的变量

时间:2019-07-09 16:06:47

标签: c++ language-lawyer c++20

抱歉,如果这已在其他地方讨论过。令我感到沮丧的是,每当我试图检查调用函数的后置条件时,我经常必须将返回变量修饰为未使用状态,以避免编译器警告:

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 个答案:

答案 0 :(得分:2)

该标准完全没有定义used。也就是说,合同主张在道德上等同于

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

并且即使使用条件为literal false(由于生成的代码,还有其他原因),编译器通常也不会发出警告。所以你应该没事。