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)
还是这种实现定义的行为?
该标准根本没有定义使用。也就是说,合同主张在道德上等同于
\n\nif(__check_contract<level>())\n if(!condition) __handle_violation(\xe2\x80\xa6);\nRun Code Online (Sandbox Code Playgroud)\n\n即使使用条件是文字(false由于生成的代码等原因),编译器通常也不会发出警告。所以你应该没问题。