抱歉,如果这已在其他地方讨论过。令我感到沮丧的是,每当我试图检查调用函数的后置条件时,我经常必须将返回变量修饰为未使用状态,以避免编译器警告:
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]];
还是这种实现定义的行为?
答案 0 :(得分:2)
该标准完全没有定义used。也就是说,合同主张在道德上等同于
if(__check_contract<level>())
if(!condition) __handle_violation(…);
并且即使使用条件为literal false
(由于生成的代码,还有其他原因),编译器通常也不会发出警告。所以你应该没事。