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

Kyl*_*fel 11 c++ language-lawyer c++20

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

auto const count [[maybe_unused]] = some_map.erase(some_key);
assert(count == 1);
Run Code Online (Sandbox Code Playgroud)

该属性的原因assert很明确-是一个预处理器宏,如果NDEBUG设置了则扩展为无操作,或者如果NDEBUG未设置则实际计算表达式。在前一种情况下,count在技​​术上不使用,因此出现编译器警告。

随着C ++ 20中引入合同,该count变量是否仍被视为未使用?换句话说,我将能够执行以下操作:

auto const count = some_map.erase(some_key); // no attribute
[[assert: count == 1]];
Run Code Online (Sandbox Code Playgroud)

还是我必须做一些丑陋的事情:

auto const count [[maybe_unused]] = some_map.erase(some_key);
[[assert: count == 1]];
Run Code Online (Sandbox Code Playgroud)

还是这种实现定义的行为?

Dav*_*ing 4

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

\n\n
if(__check_contract<level>())\n  if(!condition) __handle_violation(\xe2\x80\xa6);\n
Run Code Online (Sandbox Code Playgroud)\n\n

即使使用条件是文字false由于生成的代码等原因),编译器通常也不会发出警告。所以你应该没问题。

\n