C 20合同和未使用的变量



如果在其他地方涵盖了这一点,则表示歉意。我的挫败感之一是,每当我试图检查呼叫功能后的条件时,我通常都必须将返回变量装饰为未使用的返回变量,以避免编译器警告:

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

属性的原因很明显 - assert是一个预处理器宏,如果设置了NDEBUG,则可以扩展到NO-OP,或者如果未设置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]];

还是此实现定义的行为?

标准根本无法定义使用。也就是说,合同主张在道德上等同于

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

和编译器通常不会警告使用条件是字面的false(由于生成的代码,除其他原因(。所以你应该没事的。

最新更新